我想知道如何使用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
此时我预计堆栈看起来像这样:
阅读参数计数器
(gdb) x /d $ebp+8
给出预期的输出:
0xffffd110: 3
现在我尝试检查已传递的命令行参数。我期待
x /x $ebp+16
给出内存中第一个传递参数的第一个字符的地址。输出是:
0xffffd118: 0xb4
但是当我试图访问该区域时
(gdb) x /x 0xb4
我得到了:
0xb4: Cannot access memory at address 0xb4
这使我得出结论,我试图访问一个与我的命令行参数存储位置不同的位置。
有人能给我一些指向命令行参数真实位置的指示吗?
答案 0 :(得分:2)
C的主要功能以与Linux加载器的第一个被调用函数不同的方式获取参数。概括C中的main声明:int main(int argc, char *argv[])
(如标准中所述)。 main函数将获取一个值和一个指向字符串数组的指针,即一个指向字符串的指针的指针。
铊; DR:
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)