使用 gdb 检查字符串

Examining strings using gdb

我想知道如何使用 gdb 查看传递给函数的命令行参数。

为了测试这一点,我编译了以下代码

.global main
main:
    pushl %ebp
    movl %esp, %ebp
    movl , %eax
    movl [=10=], %ebx
    int [=10=]x80

gcc -Wall -Wextra -g -m32 args.s

调用汇编器和链接器。

我的系统是 x86_64 ubuntu(但为了学习,我开始创建 32 位应用程序)。

我启动了 gdb 并通过

传递了 2 个命令行参数
start test 12345

此时我希望堆栈看起来像这样:

读取参数计数器

(gdb) x /d $ebp+8

给出预期的输出:

0xffffd110: 3

现在我试图检查已传递的命令行参数。我预计

x /x $ebp+16

给出第一个传递参数的第一个字符在内存中的地址。输出是:

0xffffd118: 0xb4

但是当我试图访问那个区域时

(gdb) x /x 0xb4

我得到了:

0xb4:   Cannot access memory at address 0xb4

这让我得出结论,我试图访问一个与我的命令行参数存储位置不同的位置。

任何人都可以告诉我命令行参数的真实位置吗?

C 的主函数获取参数的方式与 Linux 加载程序的第一个调用函数不同。重述 C 中 main 的声明:int main(int argc, char *argv[])(如标准中所述)。主函数将获得一个值和一个指向字符串数组的指针,即指向多个指向字符串的指针。

Tl;博士:

argc: x /d $ebp+8
argv[0]: x /s **(int)($ebp+12)
argv[1]: x /s *(*(int)($ebp+12)+4)
argv[2]: x /s *(*(int)($ebp+12)+8)