помочь со следами GDB (или аналогичным) - PullRequest
6 голосов
/ 25 августа 2009

У меня есть приложение. У меня есть исходный код (в C). Я могу скомпилировать все, что захочу. Добавьте любой инструмент, который я хочу к нему. И т.д. Тем не менее, я не хочу перетекать исходный код с помощью набора printf. Я хочу иметь возможность создавать какой-либо журнал, который показывает, когда записывается определенное значение (например, некоторый член глобальной структуры) (его значение изменяется). Я хотел бы иметь возможность показать исходный файл и номер строки, а также старое и новое значение.

Я также хотел бы иметь возможность указывать значение по имени, а не по адресу. Но адрес в порядке. Бонусные баллы, если я могу указать значение, локальное для функции.

Я все еще ломаю голову, пытаясь выяснить команды трассировки GDB. Любая помощь очень ценится. Спасибо.

Ответы [ 3 ]

6 голосов
/ 25 августа 2009

Во-первых, вам нужно убедиться, что ваша программа скомпилирована с символами отладки и, возможно, без оптимизации, чтобы сделать GDB наиболее полезным. Для gcc это будет -g -O0.

Во-вторых, функция, которую вы ищете, не отслеживается, это точки наблюдения.

(gdb) help watch
Set a watchpoint for an expression.
A watchpoint stops execution of your program whenever the value of
an expression changes.

Итак, приведем пример кода:

int main() {
    int a;
    a = 1;
    a = 2;
    return 0;
}

затем вы можете запустить на нем gdb и:

(gdb) b main
Breakpoint 1 at 0x80483a5: file test.c, line 4.
(gdb) run
Starting program: /tmp/test 

Breakpoint 1, main () at test.c:4
4               a = 1;
(gdb) watch a
Hardware watchpoint 2: a
(gdb) c
Continuing.
Hardware watchpoint 2: a

Old value = -1207552288
New value = 2
main () at test.c:8
8               return 0;

работает немного забавно из-за наличия в стеке, а не памяти. И если бы была включена оптимизация, она бы работала еще меньше: a была бы оптимизирована.

3 голосов
/ 03 сентября 2009

Как уже говорилось, вам нужно установить точку наблюдения для вашей переменной.

Вы используете команду "команды"

(gdb) help commands
Set commands to be executed when a breakpoint is hit.
Give breakpoint number as argument after "commands".
With no argument, the targeted breakpoint is the last one set.
The commands themselves follow starting on the next line.
Type a line containing "end" to indicate the end of them.
Give "silent" as the first line to make the breakpoint silent;
then no output is printed when it is hit, except what the commands print.

Итак, найдите номер точки наблюдения из команды watch и сделайте это (при условии, что ваши часы - второй перерыв)

(gdp) commands 2
> print a
> cont
> end

Предполагается, что переменная, которую вы хотите. Вы можете пропустить строку печати, если вы в любом случае довольны выводом, который дает вам GDB.

Вы также можете использовать команды в исходной точке останова, чтобы установить точку наблюдения и продолжить.

1 голос
/ 04 марта 2011

Спасибо вам, @derobert и @peter! Я наконец вернулся к этому, и к этому:

break main
commands
        watch somevar
        commands
                cont
        end
        cont
end
run

делает свое дело. Это работает, когда «somevar» является глобальным или локальным по отношению к «main». Если "somevar" является локальной функцией пыльника, просто замените "main" на имя этой функции выше.

Поместите эти команды в файл (например, "gdbscript") и запустите gdb как:

gdb -x gdbscript a.out
...