【发布时间】:2021-03-01 06:41:53
【问题描述】:
我在 *p = a; 之类的命令中使用 segv 调试了一个程序
在 GDB 中可以这样做
Breakpoint 2, Foo (size=4) at bar.cpp:144
144 meta->requested_size = size;
(gdb) p meta->requested_size = size
$9 = 4
(gdb) p &meta->requested_size
$10 = (size_t *) 0x7021fffffff8
(gdb) p *0x7021fffffff8 = size
$11 = 4
崩溃,而 n 导致 segv。
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x00005555555a3dcb in Foo (size=4) at bar.cpp:144
144 meta->requested_size = size;
(gdb) p $_siginfo._sifields._sigfault.si_addr
$12 = (void *) 0x7021fffffff8
How can I check whether a memory address is writable or not at runtime?,我发现这个地址不可写。这是 gdb 的结果吗?
【问题讨论】:
-
请在执行
n之前,使用命令info proc mappings转储程序的内存映射并将结果附加到您的问题中。此外,当你这样做时,如果它发生变化,请调整任何值/地址!这很重要,我们需要您显示的代码保持一致(不要混合来自程序的两个不同执行的内容)。 -
相关:How does ptrace POKETEXT works when modifying program text?。在 Linux 上,GDB 使用 ptrace,它在允许调试器修改进程映像的不可写部分方面有着悠久的、未记录的历史。