2012-10-06 72 views
1

我没有完整的源代码,只是带有符号的对象文件。读线有:在GDB中打印装配体变量

=> 0x080489cd <+169>: call 0x8049275 <read_line> 
    0x080489d2 <+174>: mov %eax,(%esp) 
    0x080489d5 <+177>: call 0x8048d59 <phase_1> 

in the function: 
8048d59: 55      push %ebp 
8048d5a: 89 e5     mov %esp,%ebp 
8048d5c: 83 ec 08    sub $0x8,%esp 

我在第一行放了一个b,并在函数名称中加了一个以确保。进入“1”后试过p *(char**)$esp,我得到:

0x80489da "\350\355\006" 

这不是我所期待的。我期望看到“1”。我也试过:

gdb x $esp 
0xbffff0cc: 0x080489da 

gdb x *0xbffff0cc 

0x80489da <main+182>: 0x0006ede8 
+0

你说你有符号的目标文件。你知道它是否用'gcc -g'编译,即带有调试信息。如果出现这种情况,您可以很快恢复100%的源代码。 – QuasarDonkey

回答

4

如果您是在第一类的功能的破坏(我假定这就是你的意思是:“我把AB的第一行”),那么你看到的是回报地址。看起来您实际上正在看到调用phase_1的返回地址。

如果你正在寻找的是第一个参数尝试:

p *(char**)($esp+4); 
+0

我还没有把它做成阶段1。第二部分在第1阶段。我如何获得个人指导的结果? – user994165

+0

我不确定你的意思是“个别指导的结果”。说明本身没有“结果”。您可以查看写入(内存或注册)的位置。如果你想要的只是read_line的结果,那么我真的建议你尝试一下我提供的语句。如果它不起作用告诉我它说了什么。 – CrazyCasta