本例子默认调试用的可执行程序为hello
源码 hello.cpp 如下:
1 int main()
2 {
3 int b = 0;
4 int g_a = 10/b;
5 printf("end test \n");
6 return 1;
7 }
编译程序:g++ -g -O0 hello.cpp -o
hello,得到可执行程序hello,执行hello后,程序崩溃。提示如下:
Floating point exception (core dumped)
定位崩溃位置方法如下:
1.执行命令“dmesg | tail”,找到程序崩溃的IP。可找到如下输出信息: [
37241.152574] traps: hello[25803] trap divide error
ip:40053b sp:7ffc03816e50 error:0 in
hello[400000+1000]
以上信息可看出,hello崩溃的位置的IP为40053b
2.执行命令 “readelf -l
./hello”,找到第一个LOAD信息,可看到属性为RE,VirAddr为起始地址0x40 0000,大小为MemSiz
0x071c。 说明程序的范围是在0x40 0000 和0x40 071c之间,第1步找到的ip
0x40053b位于这个范围内,说明是可执行程序本身崩溃的。
Type
Offset
VirtAddr
PhysAddr
FileSiz
MemSiz
Flags Align
LOAD
0x0000000000000000 0x0000000000400000
0x0000000000400000
0x000000000000071c 0x000000000000071c R
E
200000
LOAD 0x0000000000000e10 0x0000000000600e10 0x0000000000600e10 0x0000000000000228 0x0000000000000230 RW 200000
3.执行命令“addr2line -e ./hello
0x40053b”,0x40053b为第1步定位到的ip值。可定位到程序崩溃位置如下:
/home/linting/Projects/tmp/hello.cpp:4
另外:如果用gdb调试,info registers可看到esp寄存器中存着的上一级调用。