【发布时间】:2015-02-23 07:46:34
【问题描述】:
我想知道如何查看使用 gdb 传递给函数的命令行参数。
为了测试这一点,我编译了以下代码
.global main
main:
pushl %ebp
movl %esp, %ebp
movl $1, %eax
movl $0, %ebx
int $0x80
与
gcc -Wall -Wextra -g -m32 args.s
调用汇编器和链接器。
我的系统是 x86_64 ubuntu(但为了学习,我从创建 32 位应用程序开始)。
我启动了 gdb 并传递了 2 个命令行参数
start test 12345
此时我希望堆栈看起来像这样:
- 地址参数 2
- 地址参数 1
- 程序的地址名称
- argc
- 旧eip
- 旧的 ebp
读取参数计数器
(gdb) x /d $ebp+8
给出预期的输出:
0xffffd110: 3
现在我尝试检查已传递的命令行参数。我期待
x /x $ebp+16
给出内存中第一个传递参数的第一个字符的地址。输出是:
0xffffd118: 0xb4
但是当我尝试访问该区域时
(gdb) x /x 0xb4
我明白了:
0xb4: Cannot access memory at address 0xb4
这使我得出的结论是,我尝试访问的位置与存储命令行参数的位置不同。
谁能告诉我命令行参数的真实位置?
【问题讨论】: