2011-07-19 8 views
4

私のプログラム(RHEL 5.3上で実行されているqtアプリケーション)のバックトレースを同僚から受け取り、分析していたので説明できないものが見つかりました。このバックトレースを見ると、mainと_startのトレースが分かります。しかしその前に私のプログラムにある_ZN19datalog_render_area9prepStripEhと_ZN12QMutexLockerD1Evが見えます。どのように私の関数のいくつかが_startとmainの前に呼び出されるのを見ることができます。それは不可能ではないですか?_startの前に見られる関数呼び出しとバックトレースのmain

 
Funct Addr| Instr. Addr | FunctionSymbol 
----------|-------------|----------------------------------------------------------| 
0x8060bf2 | 0x8060dc0 | _Z11print_tracev 
0x8061386 | 0x806141c | _Z15myMessageOutput9QtMsgTypePKc 
0x822b558 | 0x822b598 | _ZN5QListIP13QStandardItemEixEi 
0x8229ece | 0x8229f0b | _ZN12vehicleModel14updHeaderModelEP5QListIjE 
0x822be7e | 0x822bf64 | _ZN14vehTableWidget19updVehicleTabLayoutEib 
0x822c668 | 0x822c8e7 | _ZN14vehTableWidget13setupVehTableEib 
0x82845f8 | 0x82846fc | _ZN14vehTableWidget11qt_metacallEN11QMetaObject4CallEiPPv 

を(私のバックトレースのレイアウトはご容赦)...関数は、それが可能だ

 
0x8060e86 | 0x80612ce | main 

_____________________|____________________|address outside of program: 4804252 

0x8060a70 | 0x8060a91 | _start 

_____________________|____________________|address outside of program: 3218418744 

0x808df02 | 0x808df13 | _ZN12QMutexLockerD1Ev  

_____________________|____________________|address outside of program: 3218420336 
_____________________|____________________|address outside of program: 152429104 
_____________________|____________________|address outside of program: 3218420552 

0x8208fa6 | 0x820acd0 | _ZN19datalog_render_area9prepStripEh 

_____________________|____________________|address outside of program: 3218420336 
_____________________|____________________|address outside of program: 3218420500 

答えて

2

おそらく、スタックにゴミが表示されている可能性があります。正確なスタックトレースを得るために、デバッガにはフレームポインタ(レジスタを保存するためにx86では省略されることが多い)またはデバッグ情報のいずれかが必要です。この情報がなければ、推測しようとしています - それは、sorta-kindaのようなコードアドレスに見えるポインタのスタックをスキャンし、それらが属する関数に一致するように最善を尽くします。

静的な初期化によって、mainより前にコードが実行される可能性がありますが、このコードはmainが実行された時点で戻ってきたため、真のスタックトレースを実行することはできません。おそらく、_start以外のものはすべてガベージデータであり、無視しても間違いないでしょう。

+0

それは良い考えです。私は300の深さでバックトレース機能を呼び出すので、おそらく私はあなたがゴミを見ているようです。今、私はそれを考えています。私はそこに再作成したときにスタックがqt creatorデバッガウィンドウで非常に短いと確信しています。 –

1

プログラムの外に呼び出します。例えば、これらの関数は、いくつかの静的記憶期間オブジェクトの動的初期化の一部として呼び出すことができる。

玩具例:

const bool i = []() -> bool 
{ 
    // arbitrary code here 
    return true; 
}(); 

int 
main() 
{} 
+2

静的イニシャライザが存在する可能性がありますが、mainの前に戻るため、mainの正確なスタックトレースには表示しないでください。 – bdonlan

1

あなたは、静的データメンバを持つクラスを持っているように見えます。その静的データメンバのコンストラクタがQMutexLockerを呼び出しています。静的データメンバーは、main()が呼び出される前に構築されます。

+0

_ZN19datalog_render_area9prepStripEhを静的にする必要がなくなるまで修正します。別のスレッドである別のオブジェクトからのデータメンバへのアクセスがあり、この特定の変数はこの他のスレッドによって同時に非常によく読み書きできます。それは何かにつながるはずだ –

+0

私も全体のコードを通過し、2人の静的なメンバーを見つけた私は取り除いた。 thx –

+0

_ZN12QMutexLockerD1Evはデストラクタであり、コンストラクタではありません。 – bdonlan

関連する問題