0

最近、プログラムの実行シーケンスを収集するために GCC と gcov を変更しようとしています。ご存知のように、gcc は基本ブロック間のアークにコードをインストルメント化して、アークの実行回数をカウントします。したがって、アークに関数をインストルメント化すると、関数はそのアークの番号を出力するため、プログラムの実行シーケンスを収集できます。x86 および x86_64 の c プログラム、x86 の c++ プログラムでうまく機能します。ただし、x86_64 の c++ プログラムでは、セグメント エラーによってプログラムがクラッシュします。コンパイルは問題ありません。使用しているOSはCentOS 6.4です。gcc のバージョンは 3.4.5 です。誰かアドバイスはありますか?

サンプルプログラム:

#include <iostream> using namespace std; int main(){cout<<"hello world"<<endl;}

プログラムを x86_64 モードでコンパイルした場合。cout CALL になると、Segment Error でプログラムがクラッシュします。

4

3 に答える 3

0

わかりました、別の夜までにデバッグしてください。関数 emit_library_call は、関数を呼び出すための asm コードのみを生成し、コンテキスト (レジスタ) を保護しないことがわかりました。したがって、発行されたコードの前後の関数呼び出しは、不均一なコンテキストのために失敗する可能性があります。また、x86_64 asm は x86 とは異なるレジスタを使用します。したがって、x86 プラットフォームでうまく動作するのは単なる偶然かもしれません。ライブラリ関数呼び出しを発行し、コンテキストを保護できる関数 API が必要です。別の emit_library_call を作成する必要があるかもしれません。

于 2013-04-17T06:06:14.030 に答える