gpt4 book ai didi

c++ - GDB strace 显示它尝试在无效地址进行 ptrace

转载 作者:IT王子 更新时间:2023-10-29 00:53:49 25 4
gpt4 key购买 nike

我在gdb调试的时候执行ni命令遇到这样的错误:

Warning:
Cannot insert breakpoint 0.
Error accessing memory address 0x3ac706a: Input/output error.

0xf6fa4771 in siglongjmp () from /lib/libc.so.6

为了调查 gdb 遇到了什么问题,我对 gdb 进行了跟踪并得到了这样的输出:

rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0
ptrace(PTRACE_PEEKTEXT, 651, 0xcc4fdf60, [0x1cc4fe470]) = 0
ptrace(PTRACE_PEEKTEXT, 651, 0xcc4fe480, [0x3ac706a4506fa1d]) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0

...
rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0
ptrace(PTRACE_GETREGS, 27781, 0, 0x7fff8990e8b0) = 0
ptrace(PTRACE_PEEKTEXT, 27781, 0x3ac7068, [0x28b]) = -1 EIO (Input/output error)
ptrace(PTRACE_PEEKTEXT, 27781, 0x3ac7068, [0x28b]) = -1 EIO (Input/output error)

这意味着 gdb 首先在内存地址 0xcc4fe480 处进行 ptrace 并获取值 0x3ac706a4506fa1d(实际上是一个 8 字节值 0x03ac706a4506fa1d)。稍后它从该值的前 4 个字节获取对齐地址 0x3ac7068,这是一个无效地址,导致 gdb 无法 ptrace。

/proc/[pid]/maps 的内容:

cbce2000-cc353000 r-xp 00000000 08:03 295479 xxx.so
cc353000-cc3f0000 r--p 00670000 08:03 295479 xxx.so
cc3f0000-cc3f6000 rw-p 0070d000 08:03 295479 xxx.so
cc3f6000-cc3fe000 rw-p cc3f6000 00:00 0
cc3fe000-cc3ff000 ---p cc3fe000 00:00 0
cc3ff000-cc4ff000 rwxp cc3ff000 00:00 0
cc4ff000-cc500000 ---p cc4ff000 00:00 0

cc500000-cc600000 rwxp cc500000 00:00 0
cc62d000-cc673000 r-xp 00000000 08:03 295545 yyy.so
cc673000-cc674000 ---p 00046000 08:03 295545 yyy.so
cc674000-cc675000 r--p 00046000 08:03 295545 yyy.so
cc675000-cc676000 rw-p 00047000 08:03 295545 yyy.so

显示地址0xcc4fe480来自上面粗体部分。此部分与任何 .so 或 bin 文件无关。

这个问题其实和另一个问题http://stackoverflow.com/questions/9564417/gdb-cant-insert-internal-breakpoint有关,目前还没有解决。我在上一期的调查中发现了这些问题。

我在这里有 3 个问题:
1. 在此处查看 ptrace 的 strace 输出:
ptrace(PTRACE_PEEKTEXT, 651, 0xcc4fe480, [0x3ac706a4506fa1d]) = 0
为什么最后一个参数用方括号注释?是代表返回值的意思吗?手册页说 ptrace 应该为 PTRACE_PEEKTEXT 返回单词 read,但它看起来 strace 输出不遵循那个,所以我怀疑它在最后一个参数中显示返回值。
2. 在两个.so 之间有一个部分(who 为粗体),但不与任何inode 相关联。这样的部分代表什么?
3. Gdb 从该部分读取一个词并将该词用作地址,但实际上这是一个无效地址。出现这种错误的可能原因是什么?

谢谢!

最佳答案

  1. Take a look at strace output for ptrace here: ptrace(PTRACE_PEEKTEXT, 651, 0xcc4fe480, [0x3ac706a4506fa1d]) = 0 Why is the last parameter annotated by square brackets? Does it mean it represent the return value?

正确。

  1. There's a section (who with bold font) between two .so but not associated with any inode. What does such section represent?

它是一个内存区域,已使用 MAP_ANONYMOUNS 标志进行了mmap(即它不对应于磁盘上的任何文件)。

由于该区域的大小恰好是 1MB,并且它被用 PROT_NONE 映射的私有(private)区域包围,可以肯定的是这个区域代表一些线程堆栈,被堆栈保护区包围.

  1. Gdb reads one word from that section and uses that word as an address, but actually that's an invalid address. What are the possible causes of such error?

出于某种原因,GDB 认为地址 0x3ac7068 处应该有代码,并希望在那里放置一个内部 断点。 GDB 使用内部断点来跟踪加载的共享库(以及其他内容)。

maintenance info break 的输出应该揭示 GDB 认为哪些代码驻留在“坏”地址。

关于c++ - GDB strace 显示它尝试在无效地址进行 ptrace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9648718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com