Вы можете подобраться ближе;предполагая для простоты язык C / C ++
Определите функцию, которая возвращает ссылку на ваш базовый элемент для отслеживания:
// debug.h
extern "C" mydatastruct* GetDatumForDebug();
// debug.cpp
mydatastruct* GetDatumForDebug()
{
if (s_initialized)
return &some_complicated_address_lookup_perhaps_in_Cpp_or_java_orwhatever();
return (mydatastruct*) 0;
}
Затем вы можете просто
(gdb) display GetDatumForDebug()
илидаже
(gdb) display GetDatumForDebug()->s
Я предполагаю, что можно будет использовать результат GetDatumForDebug () в ваших отладочных часах, я не уверен, что вы делаете / как вы это делаете:)
Вот рабочий пример, собранный в один источник (test.cpp) для скорости: скомпилируйте с помощью g++ -g test.cpp -o test
:
static bool s_initialized = false;
struct mydatastruct { const char* s; };
static mydatastruct& some_complicated_address_lookup_perhaps_in_Cpp_or_java_orwhatever()
{
static mydatastruct s_instance = { "hello world" };
s_initialized = true;
return s_instance;
}
extern "C" mydatastruct* GetDatumForDebug();
// debug.cpp
mydatastruct* GetDatumForDebug()
{
if (s_initialized)
return &some_complicated_address_lookup_perhaps_in_Cpp_or_java_orwhatever();
return (mydatastruct*) 0;
}
int main()
{
// force initialize for demo purpose:
some_complicated_address_lookup_perhaps_in_Cpp_or_java_orwhatever();
return 42;
}
Автоматизируйте команды GDB
Добавьте следующее к.gdbinit
в вашем рабочем каталоге:
break main
run
call some_complicated_address_lookup_perhaps_in_Cpp_or_java_orwhatever()
display GetDatumForDebug()? GetDatumForDebug()->s : ""
Это автоматически выполнит эти команды при запуске GDB в этом каталоге