2010-12-04 3 views
2
(gdb) s 
Things:action (this=0x7fffffffdce0, packet=0x62c980) at file:41 
41    if(thing->work(data)) { 
(gdb) s 
Program received signal SIGSEGV, Segmentation fault. 
0x00000000004040e1 in Things:action (this=0x7fffffffdce0, packet=0x62c980) at file:41 
41    if(thing->work(data)) { 

backtraceでは、仕事(データ)の呼び出しは最後のものです。 GDBが管理するプロセスがwork(data)と入力される前に、セグメンテーションが発生しているように見えます。 listには、作業(データ)の宣言がないため、バックトレースと最新の手順で示されているよりも多くのコードが実行されたと推測されます。gdbがセグメンテーション違反を検出しました。正確な情報源を特定するにはどうすればいいですか?

  1. そのセグメンテーション違反は、(「のextern C」のない、またはいくつかの他の製剤)の悪い方法で、関数の引数として渡される悪いポインタから来ることができますか? (関数コードが実行されていないと仮定して)
  2. 詳細トレースを取得する方法は、関数を入力した後にwork()コードが実行されたか、またはプロセスが関数を入力しようとしたときにエラーが発生しました。 libcの引数?
+4

'this 'は有効ですか? '0x7fffffffdce0'は私にとってかなり高いようです。 – icecrime

+2

ええと...本当に 'thing'は無効なポインタかもしれないようです。 – birryree

+1

@icecrime:うん、「もの」が詰まった。 –

答えて

1

私はコメントで言ったように:私は(0x7fffffffdce0がゴミのように見える)thisポインタが無効であるため、実行がwork(data)に到達したことがないと信じています。 SIGSEGVはthis->です。

オブジェクトはある時点で破棄または削除されましたか、参照またはポインタを保持していますか?

私はSIGSEGVを引き起こした何の指示を参照してから行くことを解体しようとするだろう...それは、インラインでない限り

1

まあ、work()が開始されていないこともできますし、それがバックトレースの上にあったであろうそこ。

関連する問題