宕机不用怕,原来这样哒!
通常在生产环境下如果遇到宕机,我们的做法很简单gdb调试core文件,可以看到程序的堆栈信息,就可以定位问题,解决问题。
但是在某些情况下,堆栈信息由于某些原因被损坏了,bt打出来显示的全是??????
那么如果想找到问题那就难办了。
不过今天我们介绍一种,方法
使用GCC内建函数
__builtin_return_address(level)
level=0表示第一层地址
level=1表示第二层地址
level=2表示第三层地址
以此类推
使用时直接
1. printf("address %p -%p -%p ", __builtin_return_address(0),__builtin_return_address(1),__builtin_return_address(2));
2. 反编译 objdump -Cd yourExecutable > my.asm
查看printf的输出
address 0x48161a -0x4928e8 -0x739e94
这样我们就知道上面那条语句的调用情况是
0x48161a
0x4928e8
0x739e94
在my.asm中找到对应的函数地址.
就找到了相应的函数名,ok,到这里大家都明白了。
通常在生产环境下如果遇到宕机,我们的做法很简单gdb调试core文件,可以看到程序的堆栈信息,就可以定位问题,解决问题。
但是在某些情况下,堆栈信息由于某些原因被损坏了,bt打出来显示的全是??????
那么如果想找到问题那就难办了。
不过今天我们介绍一种,方法
使用GCC内建函数
__builtin_return_address(level)
level=0表示第一层地址
level=1表示第二层地址
level=2表示第三层地址
以此类推
使用时直接
1. printf("address %p -%p -%p ", __builtin_return_address(0),__builtin_return_address(1),__builtin_return_address(2));
2. 反编译 objdump -Cd yourExecutable > my.asm
查看printf的输出
address 0x48161a -0x4928e8 -0x739e94
这样我们就知道上面那条语句的调用情况是
0x48161a
0x4928e8
0x739e94
在my.asm中找到对应的函数地址.
就找到了相应的函数名,ok,到这里大家都明白了。