質問

E&Cは物議を醸す主題であることを知っていますが、それはデバッグへの間違ったアプローチを促進すると言う人もいますが、それでも明らかに有用な場合には多数のケースがあることに同意すると思います - いくつかの定数の異なる値を実験し、GUIパラメーターの再設計ぴったりの見た目を見つけるためにフライ...あなたはそれに名前を付けます。

私の質問は次のとおりです。 GDBでE&Cを使用することはありますか? 私はそれがプラットフォーム固有の機能であり、コンパイラ、デバッガー、OSとの真剣な協力が必要であることを理解しています (MSVCには、コンパイラとデバッガーが常に1つのパッケージに入っているため、これは簡単です), 、しかし...それはまだ実行可能であるべきです。 AppleがGCCのバージョンで実装していることについて何か聞いたことさえあります 必要な理由. 。そして、私はそれが確かに実行可能だと思います。

MSVCのE&Cについてのすべての誇大広告を知っている(私の経験は、MSVCユーザーが尋ねられたときに最初に言及したことだと言っています 「EclipseとGCC/GDBに切り替えてみませんか」)、かなり数年後、GCC/GDBにはまだそのような機能がないことに真剣に驚いています。その理由はありますか?私たちが話すとき、誰かがそれに取り組んでいますか?

役に立ちましたか?

解決

これは、多くの設計上の意思決定を網羅し、トレードオフを特集する驚くほど重要な量の作業です。考えてみてください:あなたはデバッグしています。免責は停止されています。メモリ内の画像には、ソースのオブジェクトコード、およびオブジェクト、ヒープ、スタックのバイナリレイアウトが含まれています。デバッガーはそのメモリイメージを検査しています。シンボル、タイプ、アドレスマッピング、PC(IP)に関するデバッグ情報をソース対応にロードしました。コールスタック、データ値を表示します。

次に、デバッグギーを停止して再起動することなく、コードおよび/またはデータの特定の可能な編集セットを許可する必要があります。最も簡単なのは、ある行のコードを別のコードに変更することです。おそらく、そのファイル、またはその関数、またはその行だけを再コンパイルします。次に、デバッグギーイメージにパッチを当てて、次回それを乗り越えたり、それを実行したりしたときに、その新しいコードを実行する必要があります。それはフードの下でどのように機能しますか?コードが置き換えられたコードの行よりも大きい場合はどうなりますか?コンパイラの最適化とどのように相互作用しますか?おそらく、ターゲットをデバッグするために特別にコンパイルされたものでのみこれを行うことができます。おそらく、あなたはそれが包み込むのが合法である可能性のあるサイトを制約するでしょう。考えてみてください:コールスタックで吊り下げられた関数でコードの行を編集するとどうなりますか。コードが返されると、関数の元のバージョンまたはラインが変更されたバージョンが実行されますか?元のバージョンの場合、そのソースはどこから来ますか?

地元の人を追加または削除できますか?それは、吊り下げられたフレームのコールスタックに何をしますか?現在の関数の?

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

あらゆる種類の使用可能なENCを機能させるために、多くの機能の詳細があります。次に、インフラストラクチャを電力ENCに提供するために必要な多くのクロスツール統合の問題があります。特に、デバッグ情報とオブジェクトコードをデバッガーに利用できるようにすることができるデバッグ情報のある種のリポジトリを設置するのに役立ちます。 C ++の場合、PDBの段階的に更新可能なデバッグ情報が役立ちます。増分リンクも役立つ場合があります。

MSエコシステムからGCCエコシステムに目を向けると、GDB/GCC/Binutils、無数のターゲット、必要なターゲットの抽象化、および「存在していない」性質が必要ないくつかのターゲットの複雑さと統合の問題を想像するのは簡単です。 ENCの理由は、GDB/GCCにまだ登場していない理由です。

ハッピーハッキング!

(PS SmallTalk-80インタラクティブプログラミング環境が何ができるかを見るのは有益で刺激的です。ST80には「再起動」の概念はありませんでした - 画像とそのオブジェクトメモリは常にライブでした。クラスはまだ実行を続けなければなりませんでした。そのような環境では、オブジェクトバージョンは仮説的ではありませんでした。)

他のヒント

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

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

17.実行の変更

プログラムでエラーが見つかったと思われると、見かけのエラーを修正することで実行の残りの結果が正しい結果につながるかどうかを確認することをお勧めします。プログラムの実行を変更するためのGDB機能を使用して、実験ごとに回答を見つけることができます。

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

割り当て: :変数への割り当て
ジャンピング: :別のアドレスで継続します
シグナリング: :プログラムに信号を与えます
戻る: :関数から戻ってきます
電話: :プログラムの機能を呼び出します
パッチ: :プログラムにパッチを当てます
コードをコンパイルして注入します: :GDBでコードをコンパイルして注入します

これは、「修正と継続」の古いApple実装へのかなり良い言及です。また、他の作業実装も参照しています。

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

これがスニペットです:

Fix and Contingは、他の多くのデバッガーによって実装された機能であり、このリリースのためにGDBに追加しました。 Sun Workshop、SGI Prodevワークショップ、MicrosoftのVisual Studio、HPのWDB、SunのホットスポットJava VMはすべて、この機能を何らかの形で提供しています。私は、数年前に追加されたHP WDB修正と継続機能に実装を基づいています。私の最終的な実装は、彼らが取ったアプローチの一般的な概要に従いますが、それらの間に共有コードはほとんどありません。これのいくつかは、建築的な違い(プロセッサとABIの両方)のためですが、さらに多くのものが実装の設計の違いによるものです。

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

更新:2012年12月21日があります GDBロードマップ 他の箇条書きの中で「修正と継続」を説明するスライドを含むPDFプレゼンテーション。プレゼンテーションの日付は2012年7月9日ですので、ある時点でこれを追加したいと思われるかもしれません。プレゼンテーションはその一部でした GNU Tools Cauldron 2012.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top