C++ 如何让gdb告诉我给定地址的内存特征

C++ 如何让gdb告诉我给定地址的内存特征,c++,memory,gdb,C++,Memory,Gdb,我有一个核心的gdb会话,它表明在读取指针的一个成员时,指针的解引用中存在SEGFULT。指针的值不为空。我假设这意味着进程无法访问内存地址。如何从core的死后gdb会话中获取此信息 例如,给定以下程序: #include <iostream> using namespace std; int main(int argc, char* argv[]) { int *ptr = new int(5); cout << "I can access it

我有一个核心的gdb会话,它表明在读取指针的一个成员时,指针的解引用中存在SEGFULT。指针的值不为空。我假设这意味着进程无法访问内存地址。如何从core的死后gdb会话中获取此信息

例如,给定以下程序:

#include <iostream>

using namespace std;

int
main(int argc, char* argv[])
{
    int *ptr = new int(5);
    cout << "I can access it here: " << *ptr << endl;

    delete ptr;

    cout << "But I shouldn't do so here: " << *ptr << endl;
    return 0;
}
#包括
使用名称空间std;
int
main(int argc,char*argv[])
{
int*ptr=新的int(5);

coutgdb没有动态分配的概念,也不知道释放的内存。它可以判断地址是否映射到进程地址空间:

gdb> info files
gdb> maintenance info sections
但由于您的程序因SIGSEGV而崩溃,您已经知道它试图访问未映射的地址

其他工具可以检测对释放内存的访问。
valgrind
通常是您的朋友,但不用于事后调试。您需要在
valgrind
下运行程序,以了解其行为

取消引用指针时出现segfault很少意味着指针指向已释放的内存。通常情况下,是指针本身驻留在已释放内存中而被重用和覆盖。因此

int** ptrarr = new int*[5];
ptrarr[3] = new int(5);
// later
delete [] ptrarr;
// later still after many memory allocations
int* ptr = ptrarr[3]; // ptrarr points to freed memory; UB but no segfault
                      // ptr contains a seemingly random value
int num = *ptr;       // possible segfault
从非插入指令的可执行文件的死后转储中提取此类信息非常困难。您需要熟悉
malloc
new
的内部工作,能够追踪它们的内部数据结构,并手动绘制它们的竞技场。这不是一项简单的任务。使用标准版本带有保留调试符号的库将有所帮助

否则,您可能会尝试映射出程序的内存,包括静态/全局变量、堆栈变量、上面所指的所有分配数据结构,以及其他分配数据结构中指针所指的所有分配数据结构。我知道没有工具能够从死后转储自动执行此操作,虽然理论上这些工具是可能的


已映射程序内存,或可能是其中的一部分,可以尝试找出一个不同类型的无关对象是否位于无效指针所在的地址。如果是这样,则可以得出两个对象中的一个可能是被释放后非法访问的空闲内存。< / P>可能的C++副本如下:只为你需要的东西付费的理念,这样就不会浪费时间去测试和阻止明显错误的东西。这篇文章没有回答我的问题。我不是问读取一个释放的内存地址是否会崩溃——在很多情况下显然不会。我甚至在我的文章中承认了这一点。我问的是gdb能告诉我什么告诉我死后内核中的内存地址。

info proc
仅适用于实时调试,不适用于死后(
core
)。谢谢,这非常有用。
int** ptrarr = new int*[5];
ptrarr[3] = new int(5);
// later
delete [] ptrarr;
// later still after many memory allocations
int* ptr = ptrarr[3]; // ptrarr points to freed memory; UB but no segfault
                      // ptr contains a seemingly random value
int num = *ptr;       // possible segfault