疯狂的想法?程序本身告诉GDB监视变量的变量

时间:2011-05-18 14:28:18

标签: debugging gdb watch

为什么我需要这个? 由于输入数据变化太大,数据的位置不断变化,因此除了打印它,睡眠30秒以便我可以手动将其输入GDB,然后继续执行程序,让程序告诉GDB在哪里可能会有用观看。 但这样的事情有可能吗?

1 个答案:

答案 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;
}

自动执行gdb命令

将以下内容附加到工作目录中的.gdbinit

break main
run
call some_complicated_address_lookup_perhaps_in_Cpp_or_java_orwhatever()
display GetDatumForDebug()? GetDatumForDebug()->s : ""

这将在该目录中启动gdb时自动执行这些命令