运行linux时,我们可以为程序设定程序在崩溃的时候生成core文件,以便于我们可以查找程序崩溃的原因。 步骤: 1. core文件配置 2. 配置生成core文件名称和路径 3. gdb调试core文件 4. 测试带动态库的程序
core 文件配置
查看系统配置生成core文件大小,输入命令行 ulimit -c/ulimit -a 命令查看系统是否开启了生成core文件的功能; core file size显示为0,表示没有开启core文件的产生;即使程序崩溃时,系统也不会生成core文件; 临时做法:输入 ulimit -cu unlimited,即设置产生的core文件的最大容量不做限制; 永久做法:在/etc/profile 后面加上一行
ulimit -c unlimited
修改完之后,source /etc/profile,使得配置生效;
配置生成core文件名称和路径
临时做法: 设置pid作为文件扩展名
echo "1" > /proc/sys/kernel/core_uses_pid
控制core文件保存位置和文件名格式
echo "/root/test/gdb/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
命令格式说明: 永久做法:需要在系统配置文件/etc/stsctl.conf中配置:
kernel.core.uses_pid=1
#note:the core file must dump on the 777 path,such as "/work/core"
kernel.core_parttern=/work/core/core-%e-%p-%t
然后置信号sysctl -p 立即生效,检查是否生效: 如果重启电脑之后还是没有无法生效,则需要再次执行sysctl -p
gdb调试core文件
默认格式:
gdb your_program core
如果你有一个core文件,确保它与你要调试的可执行文件相关联。如果core文件的名称不是默认的core,可以使用-c选项将其与可执行文件关联起来。例如:
gdb -c core your_program
GDB会显示相关的调试信息并暂停在发生错误的位置。可以使用常用的GDB命令来分析和调试代码。
简单代码调试
test.cpp
#include <iostream>
#include <stdlib.h>
void testMemoryLeak() {
//int*p = (int*)malloc(sizeof(int));
int *p;
*p = 10;
std::cout << "*p=" << *p << std::endl;
}
int main() {
testMemoryLeak();
return 0;
}
编译运行:编译的时候加上-g选项; gdb调试core文件 显示在程序的13行有段错误!
测试带动态库的程序
动态库程序
testlibrary.h
#pragma once
#include <iostream>
int addSum(const int a, const int b);
void mySwap(int *pA, int *pB);
testlibrary.cpp
#include "testlibrary.h"
int addSum(const int a, const int b) {
return a+b;
}
void mySwap(int *pA, int *pB){
int temp = *pA;
*pA = *pB;
*pB = temp;
}
执行该指令: 编译当前目录下生成libtestlibrary.so动态库;
应用程序
main.cpp
#include "testlibrary.h"
#include <iostream>
int main() {
int a = 10;
int b = 20;
std::cout << "a=" << a << std::endl;
std::cout << "b=" << b << std::endl;
int *p1,*p2;
mySwap(&p1, &p2);
std::cout << "*p1=" << *p1 << std::endl;
std::cout << "*p2=" << *p2 << std::endl;
return 0;
}
执行该指令: 链接libtestlibrary.so 和main.cpp,生成可执行文件 main; 将libtestlibrary.so拷贝到 /usr/lib/路径下: 即可执行main文件,产生core文件: gdb调试core文件 明确在testlibrary.cpp的 *pA=*pB;处崩溃的; 执行bt,知道在main.coo的第10行报错的:
附加
执行gdb运行程序
配置环境变量:
export LD_LIBRARY_PATH=/work/:$LD_LIBRARY_PATH
运行程序 gdb main(未成功,下面贴了一张别人的图)
标签:-%,core,文件,int,linux,gdb,使用,main From: https://blog.51cto.com/u_15804342/8804742