web-dev-qa-db-ja.com

Eclipse / CDTでC ++コードをデバッグするときの変数探索の改善

EclipseとCDTを使用してC++コードをデバッグすると、変数ウィンドウは扱いにくくなり、標準テンプレートライブラリまたはboost(shared_ptrなど)で定義された型にはあまり情報を与えません。

これは、std :: vectorの場合の例です。

bar {...}   
    std::_Vector_base<TSample<MyTraits>, std::allocator<TSample<MyTraits> > >   
        _M_impl {...}   
            std::allocator<TSample<MyTraits> >  {...}   
            _M_start    0x00007ffff7fb5010  
            _M_finish   0x00007ffff7fd4410  
            _M_end_of_storage   0x00007ffff7fd5010  

これらのタイプの内部に関するこの情報が有用である場合でも、ほとんどすべての場合、ここでより明確なプレゼンテーション、つまりstd :: vectorの値のリストを期待します。これを実行できるツール、プラグイン、またはその他の変更はありますか?

[〜#〜] edit [〜#〜]

次の解決策は、Linuxでは機能しません。私はubuntu 14.04、Eclipse、g ++、gdbを使用しています。

パッケージgdb-pythonが見つからず、Linuxはmingwを使用しません

67
Danvil

構造をきれいに印刷するには、pythonを使用できるGDBのバージョンが必要です。少なくともmingwを使用しているウィンドウでは、これはデフォルトのインストールでは提供されません。

Pretty Printersは、python gdbに特定の構造を表示する方法を指示するモジュールです。独自に作成することもできますが、ダウンロード可能なSTL用のプリンターは既にあります。

Windowsでプリティプリンターを機能させるには(他のOSでも同様の手順が必要です):

前提条件

インストール:

  • コマンドシェルを開き、次のように入力します。

    mingw-get install gdb-python
    
  • 終了したら、ローカルディレクトリにcdし、次のように入力してプリンターをインストールします。

    svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  • .gdbinitを開き(必要に応じてテキストエディターで作成)、「C:/ directory」をプリンターをチェックインしたフォルダーに置き換えて次のように入力します。

    Python
    システムのインポート
    sys.path.insert(0、 'C:/ directory')
    libstdcxx.v6.printersからregister_libstdcxx_printersをインポート
    register_libstdcxx_printers(なし)
    終わり

Eclipse Setup

  • Windows>環境設定> C/C++>デバッグ> GDBに移動します
  • GDB Debuggerがpython enabled GDBへのパスを置いた場合、gdb-python27.exeのような名前のmingw/binフォルダーにある可能性が高い
  • GDBコマンドファイルには、先ほど作成した.gdb initファイルへのパスが記載されています。

それだけです、通常のようにデバッグしてください。stl構造は読みやすいはずです。

27
DanChianucci

さて、gdbはSTLコンテナをネイティブにサポートしていません。 STLオブジェクトの内部動作を公開するため、これが間違っているとは言えませんが、ほとんどの場合、それは私たちが望むものではありませんか?

Gdb 7.0を使用している場合は、きれいなプリンターを利用できます。このWebサイト http://sourceware.org/gdb/wiki/STLSupport には、それらの設定方法に関する非常に簡単なチュートリアルがあります。興味のある部分の下にコピーしました:

  1. 最新のPython libstdc ++プリンターをマシン上の場所にチェックアウトします。ローカルディレクトリで、次の操作を行います。

        svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  2. 以下を〜/ .gdbinitに追加します。パスは、上記のpythonモジュールがチェックアウトされた場所と一致する必要があります。

        python
        import sys
        sys.path.insert(0, '/home/maude/gdb_printers/python')
        from libstdcxx.v6.printers import register_libstdcxx_printers
        register_libstdcxx_printers (None)
        end
    

パスは、上記の例で調整する必要がある唯一の要素でなければなりません。ロードしたら、プリンターがサポートするSTLクラスは、より人間が読める形式で印刷する必要があります。クラスを古いスタイルで印刷するには、printコマンドで/ r(raw)スイッチを使用します(つまり、print/r foo)。これは、Python pretty-printersがロードされなかったようにクラスを印刷します。

Eclipse cdtを使用しているため、デバッグ構成を.gdbinitファイルに指定することを忘れないでください。新しいデバッグ構成を作成するときは、[デバッガ]タブに移動し、[GDBコマンドファイル]フィールドに.gdbinitファイルへのパスを入力します。

それがお役に立てば幸いです!

21
pedromanoel

変数リストのデバッグビューでベクトルを展開します。

"vector_name"-> std::_Vector_base<"datatype">-> _M_impl

[_M_start]を右クリックして[配列として表示...]を選択し、その長さを入力して[OK]をクリックします。これで、ベクターの各アイテムを展開できます。

10
0x0000eWan

gdbCDTサポートがある場合(たとえば、 EclipseのGDB を参照)、これを試すことができます。 STLコンテナの参照解除

昔、私もあなたの同じ問題に出くわしました。 STLコンテナを確認するのは苦痛でした。次に、そのリンクを見つけて.gdbinitこれらの定義のいくつかをファイルします。その後の生活は楽になりました。

注:私のgdbバージョンは7.1であり、これらの定義の追加は正常に機能します。 gdbの新しいバージョンに既に含まれているかどうかはわかりません。

8
Adri C.S.

いくつかの重要な手順が省略されているため、Windows 7の対応について詳しく説明します。

これは、Eclipse CDTを使用するMinGWユーザー向けです。

0)python GDBがない場合は、シェル/コマンドを開き、MinGW-get.exeを使用してPython対応GDBを「インストール」します。

   MinGw-get.exe install gdb-python

1a) http://python.org/download/ からPython 2.7.xを取得してインストール

1b)PYTHONPATHおよびPYTHONHOMEが環境に設定されていることを確認します。

 PYTHONPATH should be C:\Python27\Lib   (or similar)
 PYTHONHOME should be C:\Python27

1c)PYTHONHOMEをPATHに追加します

 %PYTHONHOME%;...

2a)テキスト入力を開き、次のステートメントを入力します。 3行目はpythonスクリプトがある場所を指していることに注意してください。これについては以下の注を参照してください!

python
import sys
sys.path.insert(0, 'C:/MinGW/share/gcc-4.6.1/python')         
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

2b) '.gdbinit'として保存注:Windowsエクスプローラーでは、エクスプローラーのピリオドで始まるファイルに名前を付けることはできません。ほとんどのテキスト編集(メモ帳を含む)で可能です。 GDB initファイルは、ロード時にGBDが実行するGDBコマンドの「スクリプト」のようなものです。

2c) '.gdbinit'ファイルはGDBの作業ディレクトリにある必要があります(ほとんどの場合、これはプロジェクトのルートディレクトリですが、IDEで確認できます。

3)Eclipse(または他のIDE)設定ダイアログを開きます。 C++デバッガーのサブメニューに移動します。

4)C:\MinGW\bin\gdb-python27.exeをデバッガーとして使用し、.gdbinitを構成ファイルとして使用するようにEclipseを構成します。

5a)すべてのデバッグ起動構成を再作成します(古い構成を削除し、新しい構成を最初から作成します)。

--OR--

5b)各デバッグ構成を編集して、新しいgdb-python.exeをポイントし、それをポイントします。

問題が発生した場合:

-場所をpythonディレクトリに変更することを忘れないでくださいpythonコード!このディレクトリはMinGWによって作成されているので、移動しないでくださいきれいなプリンターをダウンロードするために、MinGWは手順0でそれを行いました。MinGWインストールディレクター、共有フォルダー、GCCフォルダー(バージョン番号があります)に移動すると、pythonフォルダーが見つかりますこの場所は、python GDBによってロードされたスクリプトにあるはずです。

-また、.gdbinitはPITAであり、その名前が正しく、gdb-python.exeが存在する場所とは限らないGDBの作業フォルダーに名前が付けられていることを確認してください! GDBのロード時にGDB出力を見て、a)ロード中に「python-enabled」が表示され、.gdbinitのステートメントが表示されているかどうかを確認します。

-最後に、システム変数に多くの問題がありました。 pythonで 'ImportError'が表示される場合、PYTHONPATHまたはPYTHONHOMEを設定していない可能性があります。

-「gdb-python27」を含むディレクトリ(例:C:\ MinGW\bin)もパス上にある必要があります。パスがある場合は、絶対パスを入力する必要がないため、Eclipseのセットアップが少し良くなります。 。それでも、.gbdinitには絶対パスが必要な場合があります。動作する場合、デバッガの起動時にgbd(コンソール-> gdbトレース)からの出力が次のように表示されます。

835,059 4^done
835,059 (gdb) 
835,059 5-enable-pretty-printing
835,069 5^done
....
835,129 12^done
835,129 (gdb) 
835,129 13source C:\MinGW\bin\.gdbinit
835,139 &"source C:\\MinGW\\bin\\.gdbinit\n"
835,142 13^done
835,142 (gdb) 
5

JDT(EclipseのJava環境)は、変数値をデバッグビューに表示するときに適用されるカスタム「フォーマッター」を提供することを知っています。 CDTでのgoogleのクイックルックでは、次のページが表示されます。

http://wiki.Eclipse.org/CDT/Better_Debugging_%28GSoC_project%29

これがメインのCDT行にまだ統合されているかどうかはわかりません。デバッグ中に変数を右クリックして(最後のCDTで)、カスタムフォーマッターエントリがあるかどうかを確認できます。利用できない場合は、CDTトラッカーに新しいトラッカーエントリを追加して、この機能強化を依頼することをお勧めします。

2
Manuel Selva