如果我的英语不好,我很抱歉。这个问题让我好几天了。 我有一个简单的C源代码,我正在检查子函数。首先,我用gcc创建.out文件。我正在用GDB检查这个文件。但是,如果我想反汇编被调用的函数,我总是从gdb获得一条错误消息。 序言:
unix@unix-laptop:~/booksrc $ gcc -g stack_example.c
unix@unix-laptop:~/booksrc $ gdb -q ./a.out
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) disass main
Dump of assembler code for function main:
0x08048357 <main+0>: push %ebp
0x08048358 <main+1>: mov %esp,%ebp
0x0804835a <main+3>: sub $0x18,%esp
0x0804835d <main+6>: and $0xfffffff0,%esp
0x08048360 <main+9>: mov $0x0,%eax
0x08048365 <main+14>: sub %eax,%esp
0x08048367 <main+16>: movl $0x4,0xc(%esp)
0x0804836f <main+24>: movl $0x3,0x8(%esp)
0x08048377 <main+32>: movl $0x2,0x4(%esp)
0x0804837f <main+40>: movl $0x1,(%esp)
0x08048386 <main+47>: call 0x8048344 <test_function>
0x0804838b <main+52>: leave
0x0804838c <main+53>: ret
End of assembler dump.
(gdb) disass test_function()
You can't do that without a process to debug.
(gdb)
您是否知道错误的原因?我已经使用谷歌,但我找不到任何解决问题的方法。我还搜索了指令以确保语法正确。 http://visualgdb.com/gdbreference/commands/disassemble
感谢阅读, 相交!
答案 0 :(得分:2)
gdb
command)的语法是disass
function-name ,因此您应该输入
disass test_function
阅读正版GDB documentation。
但你输错了 ;然后结束括号是错误的。disass test_function()
请确保使用gcc -Wall -g
最后,您可以要求gcc
输出汇编程序文件。例如,尝试使用
source.c
文件
gcc -O1 -S -fverbose-asm source.c
(如果您愿意,可以省略-O1
或将其替换为-g
然后使用编辑器(或某个寻呼机)查看生成的source.s
程序集文件。
答案 1 :(得分:0)
也许函数不存在,因为它在编译期间被内联。我之前从未见过您的错误消息,抱歉。
请尝试使用以下附加标志进行编译:
-O0 -g
您还可以通过以下方式查看所有功能起始地址:
objdump -x <filename>
这为您提供了可执行文件中的符号列表,其中包含函数的所有起点。
您还可以使用以下命令反汇编代码:
objdump -d <filename>