我有一個核心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