Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用gdb读取局部变量?_C_Assembly_Gdb - Fatal编程技术网

C 如何使用gdb读取局部变量?

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查看$ebp的正偏移量,您可以找到任何参数:

(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