我在Linux上使用gdb版本6.8-debian。我一直很好奇c程序中的主函数是如何被执行并且在不同的地方播放和查看的,我知道函数__libc_start_main对此负责。 __libc_start_main的参数是:主要的地址(就像我们从c知道的那样,路径总是以argv [0]给出的),下一个应该存在于寄存器ESI中的argc,以及应该是argv的下一个地址在ECX中。使用gdb访问命令行参数
要玩我做了如下简单的程序,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并设置主断点和__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
在这里,我遇到断点2 __libc_start_main,可与
(gdb) p $esi
和
(gdb) x/s *($ecx)
可正常工作查看argc和argv [0],但我如何访问第一个非隐命令行参数“qwerty”?我已经尝试继续到主要的断点处,但是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)