2010-11-29 12 views
19

私はE & Cが議論の余地があると思っていますが、デバッグに間違ったアプローチをしているとも言われていますが、それでも明らかに有用なケースがたくさんあることに同意できますいくつかの定数の値が異なっていて、GUIパラメータをオンザフライで再設計して見栄えを良くしています。名前を付けます。GDBで編集し続ける

私の質問はです.GDBにはE & Cがありますか?私はそれがプラットフォーム固有の機能であり、コンパイラ、デバッガ、そしてOSとの深刻な協力が必要であることを理解しています(MSVCはコンパイラとしてこの1つが簡単で、デバッガは常に1つのパッケージに入っています)、まだ実行可能でなければならない。私はAppleがGCCのバージョンで実装したことについて何か聞いたこともある。私はそれが確かに実現可能であると言います。 MSVCのE & C(私の経験は、それが「なぜEclipseに切り替えるとgcc/gdbのではない」を尋ねられたときMSVCのユーザーはもちろんの最初のものだと言う)についてのすべての誇大宣伝を知っ

は、私はかなり後に真剣に驚いていますGCC/GDBにはまだこのような機能はありません。それにはどんな理由がありますか?話しているうちに誰かがそれに取り組んでいますか?

+0

本当の答えはここでは不可能です。それは巨大な炎と下降餌になります。 programmers.seを試して、フォスの世界でリーダーシップの役割について質問してください。 –

+1

ハンス、私は心からあなたの発言を理解していません。私は自分の質問がかなり整形されていると信じています。一般的なツールチェーンとよく知られているデバッガ機能についての特定の質問です。 gcc/gdbでE&Cを実装するのを止める重要な技術的なブロックがあるかどうか、そしてそれを実装する上ですでに知られている作業があるかどうかを知りたい。 – Kos

+0

Heh。私はE&Cを使ったことはありませんが、Eclipseや他のGCC/GDBベースのコンボよりもずっと優れたVisual Studioがあります。これは、エディタとデバッガの緊密な統合によるものであり、私はインターフェイスがかなり軽量であることを好みます(より重い重量機能を使用しない限り)。私の意見では、他のIDEは簡単に使用できるものではありません。私はVCCIを使ってWITH GCCや他のさまざまなプラットフォームを開発しています。 – Goz

答えて

15

でコードをコンパイルして注入することは、多くの設計上の決定と機能のトレードオフを網羅する、仕事の驚くほど非自明な量です。考えてみましょう:あなたはデバッグしています。デフジは中断されています。メモリ内のイメージには、ソースのオブジェクトコード、オブジェクト、ヒープ、スタックのバイナリレイアウトが含まれています。デバッガはメモリイメージを検査しています。これは、シンボル、タイプ、アドレスマッピング、pc(ip)に関するソース情報へのデバッグ情報をロードしています。コールスタック、データ値を表示します。

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

ローカルを追加または削除できますか?これはサスペンドされたフレームの呼び出しスタックに何をしますか?現在の関数のうち?

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

任意の種類の有用なEnC作業を行うためには、多くの機能があります。次に、EnCに電源を供給するためのインフラストラクチャを提供するために必要なクロスツール統合の問題が数多くあります。特に、デバッグ情報のリポジトリをある種のものにすると、デバッグ情報の前と後のデバッグ情報とオブジェクトコードをデバッガに利用できるようになります。 C++の場合、PDBの段階的に更新可能なデバッグ情報が役立ちます。増分リンクも役立ちます。

MSエコシステムからGCCエコシステムを見てみると、GDB/GCC/binutils、無数のターゲット、いくつかのEnC固有のターゲット抽象化に必要な複雑さと統合の問題を想像するのは簡単です。 EnCの本質的でない性質は、GDB/GCCにまだ登場していない理由です。

ハッピーハッキング!

(psスモールトーク80インタラクティブプログラミング環境でできることを知ることは有益であり、St80には「再起動」という概念はありませんでした。画像とそのオブジェクトのメモリは、このような環境では、オブジェクトのバージョン管理は仮想ではありませんでした)。

11

私はMSVCのE & Cに慣れていないんだけど、GDBはあなたが言及したことのいくつかあります:あなた一度

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

17.変更の実行

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

たとえば、変数やメモリの場所に新しい値を格納したり、プログラムに信号を与えたり、別のアドレスで再起動したり、関数から早めに返ったりすることができます。

割り当て:変数への代入
ジャンプ:あなたのプログラムを与える信号
戻る:
を呼び出す関数からの復帰:シグナリング異なるアドレス
で続けて呼び出しますプログラムの機能
パッチ:コンパイルとジェクトコード
プログラム
へのパッチ適用:GDB

+0

私が正しく理解すれば、E&Cはgcc/g ++と " gdbの「パッチ適用」機能を使用します。 gdbがすでにパッチ適用のような機能をサポートしている場合、E&Cはgcc/gdbツールチェーンには共通していないことに驚いています。 – Kos

+0

GDB用語では、「パッチ適用」はかなり制限されています。これは基本的に実行中のコアの一部を書き直すことを可能にする一方で、Jan Grayが優れた答えで指摘した真の再コンパイルに必要な安全性を提供しません。 – Mark

3

これはAppleの「fix and continue」実装のかなり良いリファレンスです。また、他の実装の実装も参照しています。ここで

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

抜粋です:

修正と続け、我々は、このリリースのために私たちのGDBに追加し、他の多くのデバッガ、 によって実装される機能です。 Sun Workshop、SGI ProDev WorkShop、MicrosoftのVisual Studio、HPのwdb、SunのホットスポットJava VMはすべてこの方法を提供しています。私は 実装をHP wdb Fix and Continue機能に基づいて実装しました。この機能は、 に数年前に追加されました。私の最終的な実装は、彼らが取ったアプローチの一般的な概要である に従っていますが、その間に共有されるコードはほとんどありません。これはアーキテクチャ上の違い(プロセッサとABIの両方)が異なるためですが、実装設計上の相違のためにさらに多くのものが です。

この機能は、ツールチェーンの新しいバージョンで削除されている可能性があります。

更新日:12月21-2012 GDB Roadmap PDFプレゼンテーションには、他の箇条書きの中で「修正と継続」を記述したスライドが含まれています。プレゼンテーションは2012年7月9日〜12日の日付であるため、ある時点でこれを追加する予定です。プレゼンテーションはGNU Tools Cauldron 2012の一部でした。

関連する問題