2011-07-17 4 views
4

私はsnprintfを実行しており、segフォルトが発生しています。セグメンテーションフォルトのスタックトレースを理解する

コアファイルをgdbにロードしたとき、次のようになります。gdb my_executable core;そして、バックトレースを取得するにはbtをした、私は次のようました:

Program terminated with signal 11, Segmentation fault. 
#0 0x88207fc2 in memcpy() from /usr/lib/libc.so.6 
(gdb) bt 
#0 0x88207fc2 in memcpy() from /usr/lib/libc.so.6 
#1 0x88205eb6 in __sfvwrite() from /usr/lib/libc.so.6 
#2 0x881fbc95 in strchr() from /usr/lib/libc.so.6 
#3 0xbfbe6c14 in ??() 
#4 0xbfbe69d8 in ??() 
#5 0x881ed91e in localeconv() from /usr/lib/libc.so.6 
#6 0x881fec05 in __vfprintf() from /usr/lib/libc.so.6 
#7 0x881f7d80 in snprintf() from /usr/lib/libc.so.6 
#8 0x08052b64 in my_function (files=0xbfbed710, filename=<value optimized out>) at myfile.c:1102 
#9 0x08053bfb in main (argc=4, argv=0xbfbedd90) at myfile.c:225 

を私はワンセグ障害の場合には、そのようなスタックを何回も見たが、正しく理解していませんでした。

トレースでコールを調べるだけで、何がうまくいかないのかわかりますか?

注:コードを要求しないでください。私の動機は、コードに関係なく、このようなスタックトレースが何を意味するのかを理解するだけです。私はトップの "memcpy"が失敗しているのを見る。私はこの状況でいつ起こるのか理解したい。

答えて

7

機能はmyfile.c:1102です。これは、標準ライブラリを不正にメモリにアクセスさせることになります。オペレーティングシステムは、プログラムを通知して、sigsegvでスラップします。 )(StackOverflowの:)に見られるように)

一般的な理由は、以下のとおりです。

  • 書き込みは、読み取り専用メモリ
  • 使用して割り当てられたブロックの終わりを越えメモリへのアクセス初期化されていないポインタ

長い関数リストは、誰がそれを行ったのかを示しています。だから、:

  • my_functionは、それが呼び出すだけの痕跡だ
  • __vfprintfと呼ば
  • snprintf ...
+0

「よくある理由」に感謝します。私はそのようなセグメンテーションを引き起こす可能性がある事柄の網羅的なリストを探しています。あなたの助けを感謝:) – hari

0

と呼ばれます。プログラム内の最初の関数呼び出しは が下部に表示されますが、一般的にはmainになり、他の 関数の呼び出し(メイン)がその上に表示されます。新しいコールが という別のサブルーチン(関数)を呼び出すと、それは一番上にスタックされ、プロセスは続行されます。

GDBは利用可能であると考えて有用な情報を表示します。最初の列 は、スタック位置(上端)です。 2列目にはコールのアドレスである があり、残りの情報には呼び出された関数の名前と が含まれています。これらは大きく異なることに注意してください。場合によっては シンボルの名前を取得することができず、??()がスタックの#3と#4のように表示されます。 トレースソースが利用可能になると、関数が定義されている行も と表示されます(at myfile.c:225など)。

2

実行ファイルをValgrindで実行することをお勧めします。既に解放されたメモリを使用するなど、コードの問題が発生した場合は、追加のコールトレースを出力することがあります。これは、通常、クラッシュの理由を理解するのに役立ちます。

+0

ありがとう。あなたはValgrindのための良いスタートリンク/ポインタを持っていますか? – hari

+1

Valgrindを使い始めるには[クイックスタートガイド](http://valgrind.org/docs/manual/QuickStart.html)があります。詳細な情報については、[Valgrind User Manual](http://valgrind.org/docs/manual/manual.html)を参照してください。ユーザーマニュアルの[Memcheck](http://valgrind.org/docs/manual/mc-manual.html)に注意してください。これはメモリエラー検出器です。コード内のメモリ関連の問題の数を検出できます。 – ks1322

+0

ポインタに感謝して、それらを調べます。 – hari

関連する問題