小编Mic*_*ehm的帖子

使用 gdb 访问命令行参数

我在使用 gdb 版本 6.8-debian 的 linux 上。我一直很好奇 c 程序中的 main 函数是如何执行的,并在不同的地方玩弄和查看,我了解到函数 __libc_start_main 对此负责。__libc_start_main 的参数包括:main 的地址(就像我们从 c 中知道的那样,路径总是以 argv[0] 的形式给出),下一个 argc 应该驻留在寄存器 ESI 中,以及下一个 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;
}
Run Code Online (Sandbox Code Playgroud)

现在我开始调试 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
Run Code Online (Sandbox Code Playgroud)

在这里,我在 __libc_start_main 中遇到了 Breakpoint 2 并且可以查看 argc …

c assembly gdb

5
推荐指数
2
解决办法
9471
查看次数

标签 统计

assembly ×1

c ×1

gdb ×1