Linux下GDB调试无调试信息二进制:如何在puts调用前断住不进函数
解决GDB在调用puts前断住的问题
直接b puts会断在puts函数的入口处,所以会进入函数内部。要在调用puts的指令执行前断住,有两种可行方法:
方法一:使用捕捉点自动拦截调用
GDB的catch call命令可以在函数被调用的指令处(进入函数前)触发断点,适合无调试信息的二进制:
gdb> catch call puts gdb> r
程序会在第一次执行call puts指令时停下,此时还未进入puts函数,用x/i $pc可以看到当前指令就是call puts。
方法二:手动定位调用点并设置断点
如果需要精准定位某一处调用:
- 先断在main函数入口:
gdb> b main gdb> r - 反汇编main函数,找到其中调用puts的指令地址:
输出里会找到类似gdb> disassemble maincall 0xxxxxxx <puts>的行,记录该call指令的地址(比如0x55555555476a)。 - 在该call指令地址设置断点:
程序会停在执行该call指令前,未进入puts函数。gdb> b *0x55555555476a gdb> c
内容的提问来源于stack exchange,提问作者Alexander Haas
相关产品推荐
相关产品推荐

