gpt4 book ai didi

debugging - GDB:如何查看哪些内存地址是可访问的?

转载 作者:行者123 更新时间:2023-12-02 22:40:20 25 4
gpt4 key购买 nike

假设,在调试 session 中我有一个地址不幸地指向一些垃圾。我想检查它周围的内存,看看附近有什么。正如预期的那样,出现以下错误:

(gdb) x/64 $t5
0x842da7ac: Cannot access memory at address 0x842da7ac

所以,问题是:有没有办法读取一系列地址,其中一些是无效的?

(更准确地说,我怎么知道在上面的示例中 $t5+n 是某些 0 < n <= 64 的有效地址?)

最佳答案

您无法读取无效地址(显然)。

在某些操作系统上,您可以在 GDB 中停止进程时向操作系统查询有效地址。例如,在 Linux 上cat /proc/<pid>/maps将为您提供有关哪些地址有效(以及它们有效的访问模式)的信息。其他操作系统可能有类似的机制。

自从您标记了您的问题 post-mortem ,不能使用上述机制;但你必须有一个 core文件。在 Linux(和其他 ELF 系统)上,readelf -l core会告诉您哪些内存区域被写入核心,这通常可以让您很好地了解崩溃时哪些内存是有效的。但是,只读映射通常不会写入 core ,因此您可能在 readelf 中看不到此类映射输出。

所有现代操作系统都使用分页,并且页面至少为 1K (尽管 4K 更常见),因此您可以看出最接近 $t5 的内存可能有效的是 0x842da800 ,等等n >= 84 (字节)。

最后,如果你要求 GDB 检查 64 个单词,而 GDB 无法检查第一个单词,它将停止。

但是,如果您使用的是 GDB-7.x,您可以要求 GDB 在 Python 中一次检查一个单词,如果 GDB 无法检查该特定单词,则会抛出 Python 异常。但由于您可以捕获 Python 异常,因此编写一个脚本来实现“检查接下来的 N 个单词,忽略任何不可读的单词”在 Python 中是微不足道的(我相信这回答了您“如何做到这一点”的问题)。

关于debugging - GDB:如何查看哪些内存地址是可访问的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3759823/

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