でコードをコンパイルして注入することは、多くの設計上の決定と機能のトレードオフを網羅する、仕事の驚くほど非自明な量です。考えてみましょう:あなたはデバッグしています。デフジは中断されています。メモリ内のイメージには、ソースのオブジェクトコード、オブジェクト、ヒープ、スタックのバイナリレイアウトが含まれています。デバッガはメモリイメージを検査しています。これは、シンボル、タイプ、アドレスマッピング、pc(ip)に関するソース情報へのデバッグ情報をロードしています。コールスタック、データ値を表示します。
デバッグ対象を停止して再起動することなく、コードやデータの特定の変更を可能にすることができます。一番簡単なのは、ある行のコードを別の行に変更することです。おそらく、そのファイルを再コンパイルするか、その関数だけを再コンパイルするか、またはその行だけを再コンパイルします。今度は、デバッグ対象のイメージにパッチを適用して、次にコードを実行したり、コードを実行したりするときに、新しいコード行を実行する必要があります。どのようにそれはボンネットの下で動作しますか?コードが置き換えられたコード行より大きい場合はどうなりますか?どのようにコンパイラの最適化と対話するのですか?おそらく、特別にコンパイルされたEnCデバッグターゲットでのみこれを行うことができます。おそらく、EnCに合法的な可能性のあるサイトを制限することになります。考えてみましょう:コールスタックで中断された関数内のコード行を編集するとどうなりますか?コードが返ってくると、元のバージョンの関数または行が変更されたバージョンが実行されますか?元のバージョンの場合、そのソースはどこから来たのですか?
ローカルを追加または削除できますか?これはサスペンドされたフレームの呼び出しスタックに何をしますか?現在の関数のうち?
ファンクションシグネチャを変更できますか?オブジェクトにフィールドを追加/削除する既存のインスタンスはどうですか?保留中のデストラクタやファイナライザはどうですか?等
任意の種類の有用なEnC作業を行うためには、多くの機能があります。次に、EnCに電源を供給するためのインフラストラクチャを提供するために必要なクロスツール統合の問題が数多くあります。特に、デバッグ情報のリポジトリをある種のものにすると、デバッグ情報の前と後のデバッグ情報とオブジェクトコードをデバッガに利用できるようになります。 C++の場合、PDBの段階的に更新可能なデバッグ情報が役立ちます。増分リンクも役立ちます。
MSエコシステムからGCCエコシステムを見てみると、GDB/GCC/binutils、無数のターゲット、いくつかのEnC固有のターゲット抽象化に必要な複雑さと統合の問題を想像するのは簡単です。 EnCの本質的でない性質は、GDB/GCCにまだ登場していない理由です。
ハッピーハッキング!
(psスモールトーク80インタラクティブプログラミング環境でできることを知ることは有益であり、St80には「再起動」という概念はありませんでした。画像とそのオブジェクトのメモリは、このような環境では、オブジェクトのバージョン管理は仮想ではありませんでした)。
本当の答えはここでは不可能です。それは巨大な炎と下降餌になります。 programmers.seを試して、フォスの世界でリーダーシップの役割について質問してください。 –
ハンス、私は心からあなたの発言を理解していません。私は自分の質問がかなり整形されていると信じています。一般的なツールチェーンとよく知られているデバッガ機能についての特定の質問です。 gcc/gdbでE&Cを実装するのを止める重要な技術的なブロックがあるかどうか、そしてそれを実装する上ですでに知られている作業があるかどうかを知りたい。 – Kos
Heh。私はE&Cを使ったことはありませんが、Eclipseや他のGCC/GDBベースのコンボよりもずっと優れたVisual Studioがあります。これは、エディタとデバッガの緊密な統合によるものであり、私はインターフェイスがかなり軽量であることを好みます(より重い重量機能を使用しない限り)。私の意見では、他のIDEは簡単に使用できるものではありません。私はVCCIを使ってWITH GCCや他のさまざまなプラットフォームを開発しています。 – Goz