60

GDB wikiの指示に従って、 STL コンテナーを表示するための python pretty-printers をインストールしました。私の~/.gdbinit今は次のようになります:

python 
import sys 
sys.path.insert(0, '/opt/gdb_prettyprint/python') 
from libstdcxx.v6.printers import register_libstdcxx_printers 
register_libstdcxx_printers (None) 
end 

ただし、GDB を実行して STL タイプを出力しようとすると、次のようになります。

print myString
Python Exception <class 'gdb.error'> No type named std::basic_string<char>::_Rep.: 
$3 = 

誰でもこれに光を当てることができますか?GDB 7.4 に付属する Ubuntu 12.04 を実行しています。

4

9 に答える 9

10

以下のGDB マクロ( ~/.gdbinitファイルに追加) を試して、STL コンテナー タイプのデータとそのデータ メンバーを出力することができます: https://gist.github.com/3978082

于 2012-10-30T03:10:05.660 に答える
6

私はこの問題に遭遇し、それを理解しようとしているときにこのページにアクセスしました。私は最終的にそれを修正し、私の経験を共有する価値があると思いました.

私は gcc-5.2 を使用しているので、svn リポジトリから gcc-5-branch バージョンの pretty printer をダウンロードしました。ただし、次の 2 つの mod を実行する必要がありました。

  1. ~/.gdbinitファイルを編集するとき、提案された追加は

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

ただし、register_libstdcxx_printers (None)libstdcxx_printers が既に登録されているというエラーが表示され続けたため、行にコメントする必要がありました。どうやら、インポート段階で登録されるようです。

  1. と の printers.py ファイルを編集する必要がstd::setありstd::mapました。タイプ_Rep_typeはどちらもprivateなので。特に、 svn リポジトリの gcc-4_6-branch バージョンの pretty printer バージョンの対応するルーチンに置き換えchildrenます。それ以来、エラーは発生しておらず、現在はうまく印刷されています。std::mapstd::set

お役に立てれば。

于 2015-10-19T20:29:41.760 に答える
5

gcc のバージョンを確認してください。4.7 未満の場合は、別の printer.py ファイルを使用する必要があります。http://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch/libstdc++-v3/python/からファイルを取得します。

于 2013-07-11T13:42:19.293 に答える
2

Python例外の後に入力info type _Repすると、gdbは_Repに一致するロードされたクラスについて通知します。そのリストは、Pythonがあなたのを見つけることができない理由を見つけるのに役立つ可能性がありますstd::string class

私はちょうどあなたの問題に直面しました、そして私の場合、かなりの印刷を壊したインテルCコンパイラー、iccでした。std::string特に、結果の非修飾icc名は次のようになります。

std::basic_string<char, std::char_traits<char>, std::allocator<char> >::std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep;

しかし、きれいなプリンターは修飾されていないgcc名を探していました:

std::basic_string<char, std::char_traits<char>, std::allocator<char>::_Rep;

問題を解決するために私がしたことは、printers.pyのクラスStdStringPrinterを変更し、文字列の非修飾名をtypenameに追加してgdbで検索することでした。行の置き換え:

reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer ()

これとともに:

reptype = gdb.lookup_type (str (realtype) + '::' + str (realtype) + '::_Rep').pointer ()

から取得したリストを使用しinfo typeて、きれいなプリンタを修正して動作させることができます。

于 2013-01-22T18:08:05.833 に答える
1

非 GNU STL ライブラリ、または非常に古い GCC を使用していると思いますlibstdc++。私のコンパイラでの通常の STL 文字列の型は次のとおりstd::basic_string<char, std::char_traits<char>, std::allocator<char> >です。ではないことに注意してくださいstd::basic_string<char>

Pythonコードにはこれが含まれています:

reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer ()

::Repこれは、基本文字列型が実際に何であれ、ネストされた型を検索します。エラー メッセージは、使用している奇妙なライブラリの文字列クラスが実際には::Repネストされた型を持たないことを示しています。

于 2012-10-17T18:31:45.150 に答える
1

ここにリンクの説明を入力するのと同様に 、〜/ .gdbinitで機能しました:

python
import sys
sys.path.insert(0, '/usr/share/gcc-8/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
于 2020-03-28T09:56:51.910 に答える