Сумасшедшая идея? Сама программа говорит GDB следить за переменными на предмет изменений - PullRequest
1 голос
/ 18 мая 2011

Зачем мне это нужно?Расположение данных постоянно меняется, потому что входные данные меняются слишком сильно, так что кроме печати их, спящих в течение 30 секунд, чтобы я мог вручную ввести их в GDB, а затем продолжить программу, было бы полезно просто позволить программе сообщить GDB, гдесмотреть.Но возможна ли такая вещь?

1 Ответ

0 голосов
/ 18 мая 2011

Вы можете подобраться ближе;предполагая для простоты язык 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 в этом каталоге

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...