4

同僚から自分のプログラム(RHEL 5.3で実行されているqtアプリ)のバックトレースを受け取りました。それを分析していると、説明できないことがわかりました。このバックトレースを見ると、mainと_startのトレースに気付くでしょう。しかしその前に、私のプログラムにある_ZN19datalog_render_area9prepStripEhと_ZN12QMutexLockerD1Evが表示されます。_startとmainの前に関数の一部が呼び出されるのをどのように確認できますか。それは不可能ではありませんか?(私のバックトレースのレイアウトを許してください)

Funct Addr | 命令 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 | 主要  

_____________________ | ____________________ |プログラム外のアドレス:4804252  

0x8060a70 | 0x8060a91 | _始める  

_____________________ | ____________________ |プログラム外のアドレス:3218418744  

0x808df02 | 0x808df13 | _ZN12QMutexLockerD1Ev    

_____________________ | ____________________ |プログラム外のアドレス:3218420336  
_____________________ | ____________________ |プログラム外のアドレス:152429104  
_____________________ | ____________________ |プログラム外のアドレス:3218420552  

0x8208fa6 | 0x820acd0 | _ZN19datalog_render_area9prepStripEh  

_____________________ | ____________________ |プログラム外のアドレス:3218420336  
_____________________ | ____________________ |プログラム外のアドレス:3218420500  
4

3 に答える 3

2

ほとんどの場合、スタックにゴミが表示されています。正確なスタックトレースを取得するには、デバッガーはフレームポインター(レジスターを保存するためにx86では省略されることが多い)またはデバッグ情報のいずれかを必要とします。この情報がないと、推測を試みます。スタックをスキャンして、一種のようなコードアドレスに見えるポインターを探し、それらが属する関数に一致させるために最善を尽くします。

他の人が述べているように、静的初期化によりコードが実行される前に実行される可能性がありますmainが、このコードは実行される時点で返されるmainため、真のスタックトレース上でビジネスを行うことはできません。ほとんどの場合、_start以外はすべてガベージデータであり、無視しても問題ありません。

于 2011-07-20T03:49:50.050 に答える
1

それが可能だ。たとえば、これらの関数は、静的ストレージ期間オブジェクトの動的初期化の一部として呼び出すことができます。

おもちゃの例:

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

int
main()
{}
于 2011-07-19T23:58:05.633 に答える
1

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

于 2011-07-19T23:58:55.520 に答える