我想知道如何使用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
得出的结论是,我尝试访问的位置与存储命令行参数的位置不同。
谁能给我一些指向命令行参数真实位置的指针?
C的主要功能以与Linux加载程序的第一个调用函数不同的方式获取参数。概述C:中的main声明int main(int argc, char *argv[])
(如标准中所述)。main函数将获得一个值和一个指向字符串数组的指针,即一个指向多个字符串的指针。
Tl; 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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句