为什么我需要这个? 由于输入数据变化太大,数据的位置不断变化,因此除了打印它,睡眠30秒以便我可以手动将其输入GDB,然后继续执行程序,让程序告诉GDB在哪里可能会有用观看。 但这样的事情有可能吗?
答案 0 :(得分:0)
你可以接近;假设为简单起见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;
}
将以下内容附加到工作目录中的.gdbinit
:
break main
run
call some_complicated_address_lookup_perhaps_in_Cpp_or_java_orwhatever()
display GetDatumForDebug()? GetDatumForDebug()->s : ""
这将在该目录中启动gdb时自动执行这些命令