gpt4 book ai didi

c - 使用 gdb 访问命令行参数

转载 作者:行者123 更新时间:2023-12-01 21:43:21 24 4
gpt4 key购买 nike

我在 Linux 上使用 gdb 版本 6.8-debian。我一直很好奇 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;
}

现在我开始调试 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)

最佳答案

是的,您的问题是缺少符号,在编译时未包含在内。

使用调试信息进行编译:

$ gcc -g3 cmdargs.c -o cmdargs

然后:

$ gdb ./cmdargs
...
Reading symbols from ./cmdargs...done.
(gdb) b main
Breakpoint 1 at 0x400545: file cmdargs.c, line 6.
(gdb) r
Starting program: cmdargs

Breakpoint 1, main (argc=1, argv=0x7fffffffdc28) at cmdargs.c:6
6 printf("%s: %s\n", "argv[1]", *++argv);
(gdb) p argc
$1 = 1
(gdb) p argv
$2 = (char **) 0x7fffffffdc28
(gdb) p *argv
$3 = 0x7fffffffe00c "/home/jcgonzalez/cmdargs"

看,现在您可以访问符号(它们已被识别)以及行号。如Let_Me_Be所示,您可以使用 array[n] 表示法访问单个数组元素,但也可以使用 *array@times 表示法一次显示所有命令行参数(包括 [0]-ed 参数)。请注意,以下示例中的第一个参数是带引号的字符串:

(gdb) set args "this is an argument" these are four more 
(gdb) r
Starting program: cmdargs "this is an argument" these are four more

Breakpoint 1, main (argc=6, argv=0x7fffffffdbd8) at cmdargs.c:6
6 printf("%s: %s\n", "argv[1]", *++argv);
(gdb) p argc
$4 = 6
(gdb) p *argv@argc
$5 = {0x7fffffffdfe6 "/home/jcgonzalez/cmdargs", 0x7fffffffdfff "this is an argument", 0x7fffffffe012 "these", 0x7fffffffe017 "are", 0x7fffffffe01b "four",
0x7fffffffe020 "more"}
(gdb) p argv[1]
$6 = 0x7fffffffdfff "this is an argument"
(gdb) p argv[2]
$7 = 0x7fffffffe012 "these"

关于c - 使用 gdb 访问命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4278153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com