当我们写程序时候难免会因为各种问题崩掉,如果是开发阶段,我们可以开gdb跟踪调试,但如果到了线上,就不能用gdb了,这时候我们可以把崩溃时候的调用栈信息打印出来,然后定位到具体崩溃的代码位置.
想要定位到具体的行号,需要在编译的时候加入-g参数,表示编译时候加入调试信息,调试信息里有相关的信息可以使地址转为行号.
下面介绍几个可以定位到崩溃位置的方法:
使用core文件
core文件其实是程序崩溃后的内存数据,也叫core dump或者dump文件,当得到core文件后就可以用gdb打开core文件,就能定位崩溃的位置了.
接下来我们先准备好一段测试代码,后面就用这段代码搞点事情
代码里我们故意除以0,使程序崩溃
float div(int a, int b){
float c = a/b;
return c;
}
int main(int argc, char** argv){
(void)argc;
(void)argv;
int a = 10;
int b = 0;
float c = div(a, b);
printf("div: %d/%d=%.2f\n", a, b, c);
return 0;
}
假如我们编译好的程序叫main,执行后,会显示Floating point exception,也就是除0错误了
bash$ ./main
Floating point exception (core dumped)
这时候看一下当前目录有没有生成core文件,默认应该是没有.
bash$ ls
main main.cpp main.o Makefile