20

E&C が物議を醸すテーマであることは承知しており、デバッグへの間違ったアプローチを助長していると言う人もいますが、それでも - いくつかの定数のさまざまな値を試したり、GUI パラメーターを再設計したりして、明らかに有用な場合が多数あることに同意できると思います。オンザフライで見栄えの良いものを見つける...名前を付けます。

私の質問は次のとおりです。GDB で E&C を使用する予定はありますか? これはプラットフォーム固有の機能であり、コンパイラ、デバッガ、および OS との深刻な協力が必要であることを理解しています(コンパイラとデバッガは常に 1 つのパッケージに含まれているため、MSVC ではこれは簡単です)が、...実行可能。Apple が GCC のバージョンに実装しているという話も聞いたことがあります[要出典]。そして、それは実際に実現可能であると言えます。

MSVC の E&C に関する誇大宣伝をすべて知っているので (私の経験では、MSVC ユーザーが「なぜ Eclipse と gcc/gdb に切り替えないのか」と尋ねられたときに最初に言及するのはそれだと言っています)、かなりの年月を経ても GCC/GDB がまだそうではないことに非常に驚いています。といった特徴があります。それには正当な理由がありますか?私たちが話している間、誰かがそれに取り組んでいますか?

4

3 に答える 3

18

これは、多くの設計上の決定と機能のトレードオフを含む、驚くほど重要な作業量です。考慮してください:あなたはデバッグしています。デバッグ対象は中断されます。メモリ内のイメージには、ソースのオブジェクト コードと、オブジェクトのバイナリ レイアウト、ヒープ、スタックが含まれています。デバッガーはメモリ イメージを検査しています。シンボル、タイプ、アドレス マッピング、PC (IP) からソースへの対応に関するデバッグ情報がロードされています。コール スタック、データ値が表示されます。

ここで、デバッグ対象を停止して再起動することなく、コードやデータに対する特定の一連の編集を許可したいと考えています。最も簡単なのは、コードの 1 行を別の行に変更することです。おそらく、そのファイルまたはその関数だけ、またはその行だけを再コンパイルします。今度は、デバッグ対象イメージにパッチを適用して、次にステップ オーバーするか別の方法で実行するときにその新しいコード行を実行する必要があります。ボンネットの下でどのように機能しますか?コードが置き換えられたコード行よりも大きい場合はどうなりますか? コンパイラの最適化とどのように相互作用しますか? おそらく、EnC デバッグ ターゲット用に特別にコンパイルされた場合にのみ、これを行うことができます。おそらく、EnC に合法である可能性のあるサイトを制限するでしょう。考えてみてください: コール スタックで中断された関数のコード行を編集するとどうなるでしょうか。コードがそこに戻ったとき、関数の元のバージョンまたは行が変更されたバージョンを実行しますか? 元のバージョンの場合、そのソースはどこから来たのですか?

ローカルを追加または削除できますか? 中断されたフレームのコール スタックはどうなりますか? 現在の機能の?

関数シグネチャを変更できますか? オブジェクトにフィールドを追加/オブジェクトからフィールドを削除しますか? 既存のインスタンスはどうですか? 保留中のデストラクタまたはファイナライザはどうですか? 等。

あらゆる種類の使用可能な EnC を動作させるには、非常に多くの機能の詳細に注意する必要があります。次に、EnC に電力を供給するためのインフラストラクチャを提供するために必要な、ツール間の統合に関する多くの問題があります。特に、編集前および編集後のデバッグ情報とオブジェクト コードをデバッガで利用できるようにする、ある種のデバッグ情報のリポジトリがあると役立ちます。C++ の場合、PDB の増分更新可能なデバッグ情報が役立ちます。インクリメンタル リンクも役立つ場合があります。

MS エコシステムから GCC エコシステムに目を向けると、GDB/GCC/binutils 全体の複雑さと統合の問題、無数のターゲット、必要な EnC 固有のターゲット抽象化、および「あると便利だが重要ではない」性質が容易に想像できます。の EnC が、GDB/GCC にまだ登場していない理由です。

ハッピーハッキング!

(ps Smalltalk-80 の対話型プログラミング環境で何ができるかを見ることは、有益で刺激的です。St80 では、「再起動」の概念はありませんでした。そのような環境では、オブジェクトのバージョン管理は仮定ではありませんでした。)

于 2010-12-14T15:31:52.967 に答える
11

私は MSVC の E&C に詳しくありませんが、GDB にはあなたが言及したことがいくつかあります。

http://sourceware.org/gdb/current/onlinedocs/gdb/Altering.html#Altering

17. 実行の変更

プログラムでエラーを見つけたと思ったら、明らかなエラーを修正することで残りの実行で正しい結果が得られるかどうかを確認したい場合があります。プログラムの実行を変更するための gdb 機能を使用して、実験によって答えを見つけることができます。

たとえば、新しい値を変数またはメモリ ロケーションに保存したり、プログラムにシグナルを与えたり、別のアドレスでプログラムを再起動したり、関数から途中で戻ることさえできます。

Assignment : 変数への代入
Jumping : 別のアドレスで継続
Signaling : プログラムにシグナルを送る
Returning : 関数から戻る
Calling : プログラムの関数を呼び出す
Patching : プログラムにパッチ
を当てる Compiling and Injecting Code : GDB にコードをコンパイルして挿入する

于 2010-11-29T12:33:27.670 に答える
3

これは、Apple の古い実装である「修正して続行」のかなり良いリファレンスです。また、他の実用的な実装も参照しています。

http://sources.redhat.com/ml/gdb/2003-06/msg00500.html

ここにスニペットがあります:

修正して続行は、他の多くのデバッガーによって実装されている機能であり、このリリースの gdb に追加されました。Sun Workshop、SGI ProDev WorkShop、Microsoft の Visual Studio、HP の wdb、および Sun の Hotspot Java VM はすべて、何らかの形でこの機能を提供しています。数年前に追加された HP wdb Fix and Continue 機能に基づいて実装しました。私の最終的な実装は、彼らが採用したアプローチの一般的なアウトラインに従いますが、それらの間で共有されるコードはほとんどありません。アーキテクチャの違い (プロセッサと ABI の両方) によるものもありますが、実装設計の違いによるものもさらに多くあります。

この機能は、ツールチェーンの新しいバージョンでは削除されている可能性があることに注意してください。

更新: 2012 年 12 月 21 日GDB ロードマップPDF プレゼンテーションがあり、他の箇条書きの中で「修正して続行」を説明するスライドが含まれています。プレゼンテーションの日付は 2012 年 7 月 9 日なので、いつか追加される可能性があります。このプレゼンテーションは、GNU Tools Cauldron 2012の一部でした。

また、E&C を GDB や Linux のどこにでも追加するのは、さまざまなコンポーネントがすべてあるため大変な作業です。

しかし、私は E&C が議論の余地があるとは考えていません。VB5 と VB6 で使用したことを覚えていますが、おそらくその前に存在していました。また、以前から Office VBA に含まれていました。そして、VS2005 以降、Visual Studio に組み込まれています。VS2003 はそれを持っていなかった唯一のものであり、開発者がそれについて遠吠えしたことを覚えています。彼らはとにかくそれを追加するつもりで、VS2005でそれを行い、それ以来そこにありました. C#、VB、および C と C++ で動作します。それは 20 年以上にわたって MS コア ツールに組み込まれており、ほぼ継続的に (VB がスタンドアロンのときは数えて)、VS2003 を差し引いています。しかし、VS2003 の期間中、Office VBA にそれがあったと言えます ;)

Jetbrains は最近、C# ツールの Rider にもそれを追加しました。彼らは、Rider ブログでそれについて自慢しました (当然のことながら)。

于 2012-08-24T20:40:01.730 に答える