【发布时间】:2011-05-15 18:09:48
【问题描述】:
我在 linux 上使用 gdb 版本 6.8-debian。我一直很好奇 c 程序中的 main 函数是如何执行的,如何在不同的地方玩耍和寻找,我了解到函数 __libc_start_main 对此负责。 __libc_start_main 的参数包括:main 的地址(就像我们从 c 中知道的那样,路径总是以 argv[0] 形式给出),应该驻留在寄存器 ESI 中的下一个 argc,以及应该是 argv 的下一个地址在 ECX 中。
为了玩耍,我制作了以下简单的程序 cmdargs.c,它简单地输出在开始时给出的第一个命令行参数:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
printf("%s: %s\n", "argv[1]", *++argv);
return EXIT_SUCCESS;
}
现在我开始调试 cmdargs 并在 main 和 __libc_start_main 上设置断点(删除了启动 gdb 的信息):
gdb cmdargs
(gdb) b main
Breakpoint 1 at 0x80483d2
(gdb) b __libc_start_main
Breakpoint 2 at 0xb7f3f5a8
(gdb) r qwerty
这里我在 __libc_start_main 中的断点 2 可以查看 argc 和 argv[0]
(gdb) p $esi
和
(gdb) x/s *($ecx)
这按预期工作,但我如何访问第一个非隐式命令行参数“qwerty”?我尝试在 main 处继续断点并介入,但无法识别 argc 和 argv(为什么?)。谁能告诉我这是怎么回事?
Breakpoint 1, 0x080483d2 in main ()
(gdb) stepi
0x080483d5 in main ()
(gdb) p argc
No symbol "argc" in current context.
(gdb) p argv
No symbol "argv" in current context.
(gdb)
【问题讨论】: