最近、gdb7 の python 拡張機能に取り組んでいます。これを使用して、デバッグ中に C++ コンテナー (リストなど) の内容を表示するための小さなツールを書きたいと思っています。しかし、リストを扱うときに問題が発生しました。これは、テスト用の私の C++ コードです。
int main() {
list<int> int_lst;
for (int i = 0; i < 10; ++i)
int_lst.push_back(i);
for(list<int>::const_iterator citer = int_lst.begin();
citer != int_lst.end(); ++citer)
cout << *citer << " ";
cout << endl;
return 0;
}
そして、「gdb を使用したデバッグ」チュートリアルに従って小さな python コードを作成し、int_lst の内容を表示しようとします。
import gdb
class Hello(gdb.Command):
def __init__(self):
super(Hello, self).__init__("plist", gdb.COMMAND_OBSCURE)
def invoke(self, arg, from_tty):
cpp_lst = gdb.parse_and_eval("int_lst")
header = cpp_lst['_M_impl']['_M_node']
next = header['_M_next']
# next is _List_node_base, I have to cast it to its derived type for data
next.dynamic_cast(gdb.lookup_type("std::_List_node<``int>").pointer())
Hello()
C++ STL では、std::_List_node_base はリスト内のノードの基本クラスですが、派生テンプレート クラス std::_List_node のみが値を含むデータ メンバー「_M_data」を持っているため、それを dynamic_cast する必要がありますが、gdb は文句を言います:
Error occurred in Python command: Couldn't determine value's most derived type for dynamic_cast
私はそれに数時間を費やしましたが、この問題についてのヒントや、この小さなツールを達成するための提案を経験した人はいますか? あなたの助けに本当に感謝します、ありがとう!