在 gdb 间接解析内存地址
Resolving memory address in gdb indirection
在使用 -g
编译以在程序中获取调试信息并在 gdb
中使用 运行 进行编译后,我可以执行以下操作来打印参数向量:
>>> p __libc_argv
= (char **) 0x7fffffffe9f8
>>> p __libc_argv[0]
= 0x7fffffffec63 "./sample.out"
我的问题有两个:
为什么 __libc_argv[0]
和 __libgc_argv
产生的内存地址不同? gdb
是否在后台进行某种解释?
如何从上面得到0x7fffffffec63
的内存地址?例如:
>>> p __libc_argv
= (char **) 0x7fffffffe9f8
>>> x/s 0x7fffffffec63 <-- how do figure out this memory address value?
0x7fffffffec63: "./sample.out"
__libc_argv
是指向指针数组的指针。 __libc_argv[0]
是该数组第一个元素的内容。没有理由认为它们应该相同,除非您出于某种原因首先 __libc_argv[0] = __libc_argv
。但这不合理,因为 __libc_argv
的元素应该是指向字符串的指针,而不是指向数组的指针。
另一方面,__libc_argv == &__libc_argv[0]
和 *__libc_argv == __libc_argv[0]
。
要得到你想要的地址,直接通过__libc_argv
即可。
>>> x/s *__libc_argv
在使用 -g
编译以在程序中获取调试信息并在 gdb
中使用 运行 进行编译后,我可以执行以下操作来打印参数向量:
>>> p __libc_argv
= (char **) 0x7fffffffe9f8
>>> p __libc_argv[0]
= 0x7fffffffec63 "./sample.out"
我的问题有两个:
为什么
__libc_argv[0]
和__libgc_argv
产生的内存地址不同?gdb
是否在后台进行某种解释?如何从上面得到
0x7fffffffec63
的内存地址?例如:>>> p __libc_argv = (char **) 0x7fffffffe9f8 >>> x/s 0x7fffffffec63 <-- how do figure out this memory address value? 0x7fffffffec63: "./sample.out"
__libc_argv
是指向指针数组的指针。 __libc_argv[0]
是该数组第一个元素的内容。没有理由认为它们应该相同,除非您出于某种原因首先 __libc_argv[0] = __libc_argv
。但这不合理,因为 __libc_argv
的元素应该是指向字符串的指针,而不是指向数组的指针。
另一方面,__libc_argv == &__libc_argv[0]
和 *__libc_argv == __libc_argv[0]
。
要得到你想要的地址,直接通过__libc_argv
即可。
>>> x/s *__libc_argv