2

これはマッドハックですが、実行の特定の時点で意図的にセグメンテーション違反を引き起こそうとしているため、valgrindはスタックトレースを提供します。

これを行うためのより良い方法がある場合は教えてください。しかし、意図的にセグメンテーション違反を引き起こす方法と、なぜ私の試みがうまくいかなかったのかを知りたいと思います。

これは私の失敗した試みです:

long* ptr = (long *)0xF0000000;
ptr = 10;

セグメンテーション違反でなくても、valgrindは少なくともそれを無効な書き込みとして認識すべきだと思いました。Valgrindはそれについて何も言いません。

なぜ何かアイデアはありますか?

編集

回答は受け入れられましたが、スタックトレースを取得するためのより適切な方法についての提案については、まだ賛成票があります...

4

6 に答える 6

7

だけお電話abort()ください。これはセグメンテーション違反ではありませんが、コアダンプを生成する必要があります。

于 2009-10-20T07:46:34.870 に答える
5

あなたはのよう*に欠けてい*ptr = 10ますか?コンパイルしないもの。

もしそうなら、どういうわけか、あなたはただ番号を割り当てているだけなので、もちろんそれはセグメンテーション違反を引き起こしません。間接参照の可能性があります。

OSでnullを逆参照するとセグメンテーション違反が発生すると仮定すると、次の方法でうまくいくはずです。

inline void seg_fault(void)
{
    volatile int *p = reinterpret_cast<volatile int*>(0);
    *p = 0x1337D00D;
}
于 2009-10-20T06:37:37.643 に答える
5

明らかなことを言って申し訳ありませんが、ブレークポイントでgdbを使用してから、バックトレースを使用してみませんか?

(gdb) b somewhere
(gdb) r
(gdb) bt
于 2009-10-20T07:43:04.967 に答える
3

他の回答で述べたようにabort()、プログラムを完全に異常終了させたい場合、またはkill(getpid(), SIGSEGV)セグメンテーション違反である必要がある場合は、電話をかけることができます。これにより、valgrindで実行していない場合でも、gdbで使用してスタックトレースを取得したりデバッグしたりできるコアファイルが生成されます。

valgrindクライアントリクエストを使用して、valgrindに独自のカスタムメッセージを含むスタックトレースをダンプさせてから、実行を続行することもできます。プログラムがvalgrindで実行されていない場合、クライアント要求は何もしません。

#include <valgrind/valgrind.h>
...
VALGRIND_PRINTF_BACKTRACE("Encountered the foobar problem, x=%d, y=%d\n", x, y);
于 2009-11-01T14:05:34.963 に答える
2

x86を使用していますか?その場合、実際にはCPUに「接続されているデバッガーを呼び出す」ことを意味するオペコードがあります。これはオペコードCC、またはより一般的にはと呼ばれint 3ます。それをトリガーする最も簡単な方法は、インラインアセンブリを使用することです。

inline void debugger_halt(void)
{
#ifdef MSVC
   __asm int 3;
#elif defined(GCC)
   asm("int 3");
#else
#pragma error Well, you'll have to figure out how to do inline assembly 
              in your compiler
#endif
}

MSVC__debugbreak()は、マネージコードのハードウェアブレークとマネージコードのMSIL「ブレーク」のどちらもサポートします。

于 2009-10-20T07:03:57.907 に答える
2

コアダンプを強制するために、プロセスにsig SEGV(11)を送信する方がよいのではないでしょうか。

于 2009-10-20T07:10:51.210 に答える