我有一个核心gdb会话,它表明在读取其中一个成员时,在指针的解引用中存在段错误。该指针的值非空。我认为这意味着该进程无法访问内存地址。如何从核心的postmortem gdb会话中获取此信息?我该如何让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;
}
如果我调试这个程序用gdb:
$ g++ -g -Wall test.cc -o test
$ gdb ./test
(gdb) b 13
...
Breakpoint 1 at 0x400943: file test.cc, line 13.
(gdb) run
Starting program: /usr/home/nfs/bneradt/test/test
I can access it here: 5
Breakpoint 1, main (argc=1, argv=0x7fffffffe348) at test.cc:13
13 cout << "But I shouldn't do so here: " << *ptr << endl;
(gdb)
我可以从PTR得到什么样的内存信息?我可以确定ptr指向释放内存吗?由于在我正在调试的核心(不在上面的玩具测试二进制文件中),我得到了一个段错误解引用 - 即从一个指针读取,而不是写入一个指针,我想原始内存位置被分页出去,因此不是过程可访问的内存?我可以从gdb会话中确定吗?
可能重复的[C + +删除 - 它删除我的对象,但我仍然可以访问数据?](http://stackoverflow.com/questions/1930459/c-delete-it-deletes-my-objects-but-我仍然可以访问数据) – user4581301
C++遵循一种只为你所需要的付款的理念,所以它不会浪费时间来测试和阻止公然错误的。 – user4581301
该帖子没有回答我的问题。我并没有问是否读取释放的内存地址会崩溃 - 在很多情况下显然不会。我甚至在我的帖子中承认。我问的是gdb可以告诉我关于postmortem核心内存地址的内容。 – firebush