0

1)最初に知りたいのですが、そのような変数をデコードする方法は?

私はこの問題の解決策を知っています。最適化フラグを削除し、揮発性にします。それをすべてやりたくありません。ソースを再度コンパイルせずに実行できる解決策はありますか? 問題は、変更を加えるたびにコンパイルに時間がかかるため、別の最適化フラグを使用してコンパイルしたくないことです。また、最適化フラグを一度変更しようとしましたが、理由により、コンパイルフラグが変更されただけでクラッシュしました私は理解できません。

また、「info reg」を実行するときにさまざまなレジスタを理解するためのドキュメントを見つけることができません。私はいくつかの変数(私が知っている値、それは何でしょうか)を期待していましたが、info regはすべての異なる値を示しています。ここで何かが欠けています。私が取り組んでいるアーキテクチャは x86_64 です

2)そのようなレジスタ変数をデコードするためにgdbが直面する制限は何ですか?それとも、この問題はすでに誰かによって取り組まれていますか? アセンブリ コードを調べて、そのレジスタにある変数を見つけることができる多くの場所を読みました。それが本当なら、なぜgdbにビルドできないのですか。この問題の解決策があれば、関連するページを教えてください

4

2 に答える 2

1

ソースがなく、デバッグ/最適化なし(つまり、サードパーティのコード)でコンパイルする場合は、コードを逆アセンブルして、変数の格納方法を決定するのが最善の方法です。

gdbでは、disassemble命令は指定された関数のアセンブリをダンプします。

disassemble <function name>

または、シンボルが削除されている場合

disassemble <address>

ここ<address>で、は関数へのエントリポイントです。

また、関数が呼び出される場所を調べて、使用される呼び出し規約を判別する必要がある場合もあります。

関数の構造と変数のレイアウト(スタック変数またはレジスター)を理解したら、デバッグ時に、レジスターまたはメモリー位置の内容をダンプすることにより、およびを使用して各命令をステップ実行nextistepi、変数の値がどのように変化するかを確認できます。 。

私自身は良い入門書やチュートリアルを知りませんが、この質問とその答えはあなたに役立つかもしれません。個人的には、Intelのマニュアルを最もよく参照していることに気づきました。これらは、IntelのWebサイトからPDFでダウンロードできます。現在、便利なリンクはありません。他の誰かがそうするなら、おそらく彼らは私の答えを更新することができます。

于 2012-10-15T15:58:57.223 に答える
0

最適化されていないコードをコンパイルすることを検討しましたか?

gccオプションで次のいずれかを試してください。

-Og
    Optimize debugging experience. -Og enables optimizations that do not interfere with debugging. It should be the optimization level of choice for the standard edit-compile-debug cycle, offering a reasonable level of optimization while maintaining fast compilation and a good debugging experience. 


-O0
    Reduce compilation time and make debugging produce the expected results. This is the default. 
于 2012-10-15T15:50:01.743 に答える