#include
ファイルを(私が書いたものではなく)記録するという厄介な問題をデバッグしています。私のプログラムではクラッシュします。つまり、working
とbroken
があり、C(++)include文は1つだけ変更されています。私が使っているライブラリの中には、デバッグ情報を持っていないものがあります。GDBを使用してC +アセンブリプログラムトレースを出力するにはどうすればよいですか?
私がしたいのは、プログラム実行のために実行されるC++のすべての行と、2つの出力を比較することができるような形式のテキストファイルでは利用できないx86命令を出力することです。間違えた。
これはGDBでも簡単にできますか?
構造体などの '#if' /'#else'バリエーションだけでなく、静的な初期化がバグかもしれません。依存関係がある場合、 '#include'はそれに含まれる他のものの順序を変更し、クラッシュを引き起こすかもしれません。あるいは、 '#include'ファイルは、初期化に失敗した静的オブジェクトを追加するかもしれません。 'gcc -E'出力はこれらの問題の調査を開始するのにも良い方法です。 '#include'が最後に置かれた(他のインクルードの順番が変更されないように)ためにdiffノイズが最小限に抑えられるかもしれません。 –
diffスパムを減らすためにいくつかの組み合わせで再生しました。これはうまくいくかもしれません:gcc -E a.cc -o a.pre; ...; diff -uw -I '^#' a.pre b.pre –
提案していただきありがとうございます。問題は、ヘッダーファイル(2レベル深い!)は#pragma pack(1)に対応する#pragma pack(pop)がなく、最後にSTLライブラリがパックされていることになりました。 。影響を受ける構造体に対してプラグマを削除し、__attribute __((packed))に切り替えると、この問題が解決されました。プログラムをクラッシュさせないようにしてから、ヘッダーの問題であることが分かったら、各レベルに含まれるヘッダーファイルに対してBFS検索を実行するまで、これを見つけ出しました。 – Mike