C 如何使用gdb读取局部变量?
我知道,通过使用gdb查看$ebp的正偏移量,您可以找到任何参数:C 如何使用gdb读取局部变量?,c,assembly,gdb,C,Assembly,Gdb,我知道,通过使用gdb查看$ebp的正偏移量,您可以找到任何参数: (gdb) x/4wx $ebp 然后,我将使用x/s查看第三个和第四个地址,因为它们将是第一个和第二个参数。局部变量呢?我如何看待从$ebp负偏移的值? 另外,是否有必要看看$eax的价值? 每当我尝试使用x/s$eax打印$eax的值时,地址超出范围或值为0,我确信这不是因为我只是在寄存器中输入了一个常量值 我尝试了info locals,但收到消息“没有可用的符号表信息”。首先,您需要将调试符号编译到二进制文件中。在当前
(gdb) x/4wx $ebp
然后,我将使用x/s
查看第三个和第四个地址,因为它们将是第一个和第二个参数。局部变量呢?我如何看待从$ebp负偏移的值?
另外,是否有必要看看$eax的价值?
每当我尝试使用x/s$eax
打印$eax的值时,地址超出范围或值为0,我确信这不是因为我只是在寄存器中输入了一个常量值
我尝试了
info locals
,但收到消息“没有可用的符号表信息”。首先,您需要将调试符号编译到二进制文件中。在当前命令中使用gcc上的-g选项来执行此操作。如果您使用的是不同的编译器,则需要查阅其文档。在此之后,“info locals”和print命令将起作用
要查看任何局部变量,只需使用“print”命令。例如,要查看局部变量“i”,它与“print i”一样简单
您应该能够以与$ebp相同的方式处理$eax。我怀疑您有问题,因为您正在使用x/s。x/s将尝试打印出一个字符串,因此它将继续打印,直到遇到空字符为止。如果长时间不发生这种情况,那么字符串的长度将超出界限。试试“x/d$eax”。您甚至可以执行“打印$eax”。您还可以使用“信息寄存器”获取所有寄存器数据
我知道,通过使用gdb查看$ebp的正偏移量,可以找到任何参数
这只适用于某些处理器和某些调用约定,并不是通用的
假设您只关心x86,并且您的代码是使用帧指针编译的(这曾经是默认值,但在opt模式下不再是GCC4.6的默认值),则局部变量将以固定的负偏移量从%ebp
分配
显然,如果您可以使用调试符号(使用-g
)重建代码,那么GDB将能够只打印它们的值,而您不需要关心GDB如何找到它们
如果不能(例如,因为代码来自第三方),则必须仔细查看反汇编并猜测。如果您猜测某个值存储在%ebp-8
,则可以使用GDB检查该值,方法与检查正偏移量完全相同:(GDB)x/wx$ebp-8
注意:编译器可以按照它想要的任何方式自由布局本地文件,因此如果您声明
int x, y, z;
编译器可以自由地将x
存储在%ebp-16
中,将y
存储在%ebp-20
中,将z
存储在%ebp-12
中