【发布时间】:2016-12-13 20:51:52
【问题描述】:
我有一个核心的 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++ 遵循只为您需要的东西付费的理念,因此它不会浪费时间测试和阻止明显的错误。
-
那篇文章没有回答我的问题。我不是在问读取释放的内存地址是否会崩溃——在很多情况下显然不会。我什至在我的帖子中承认这一点。我在问 gdb 可以告诉我关于死后核心中的内存地址的什么信息。