私はコア用のgdbセッションを持っていて、そのメンバの1つを読むときにポインタの逆参照にセグメンテーションがあることを示します。ポインタの値はnullではありません。これは、メモリアドレスがプロセスからアクセスできないことを意味すると仮定します。どのようにして、コアのポストモーテムgdbセッションからこの情報を取得できますか?私は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;
}
:
$ 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++ deleteの可能な複製 - オブジェクトを削除しますが、まだデータにアクセスできますか?](http://stackoverflow.com/questions/1930459/c-delete-it-deletes-my-objects-but- i-can-still-access-the-data) – user4581301
C++は、必要なものだけを支払うという哲学に従うので、間違って間違ったテストや時間を無駄にすることはありません。 – user4581301
その投稿は私の質問に答えません。私は解放されたメモリアドレスを読み込むのがクラッシュするかどうかについては問いません。明らかに多くの状況でそうではありません。私は私のポストでそれを認めます。私は、gdbがpostmortemコアのメモリアドレスについて教えてくれるものについて質問しています。 – firebush