Отправка команд в gdb из отлаженной программы - PullRequest
4 голосов
/ 27 января 2012

Возможно ли управление gdb из отлаженной программы?Я надеюсь на библиотеку, которая может помочь с этим, в идеале с API, таким как gdb_sendcmd("bt"), но я могу жить с чем-то вроде подключения к локальному GDB через сокет.

Основной вариант использования - это программное добавлениеточка останова данных, чтобы отслеживать, когда следующий адрес памяти модифицируется.Целевой язык, естественно, C;все, что применимо к нему, может быть повторно использовано с C ++ и Objective-C.


Ответ от Employed Russian решил мою прямую проблему, но я все еще хотел бы знать, как я могузапускать команды GDB программно из отлаженной программы.Это могло бы ускорить некоторую отладку, если бы я мог просто добавить код в проект вместо написания дополнительных команд запуска для GDB, которые бы создавали точки останова с присоединенными командами.

Так что, если есть способ выполнять команды программно, я 'я до сих пор люблю это слышать;)

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Интерфейс Python, экспортируемый GDB, позволяет вам делать много вещей. Может быть, что-то вроде этого подойдет вашим требованиям:

import gdb

CMD_FCT  = "gdb_run" 
CMD_NAME = "str"

class GdbRunBreakpoint(gdb.Breakpoint):
    def __init__(self):
        gdb.Breakpoint.__init__(self, CMD_FCT, internal=1)
        self.silent = True

    def stop(self):
        cmd = gdb.parse_and_eval(CMD_NAME).string()
        gdb.execute(cmd)
        return False
GdbRunBreakpoint()

(просто напишите, чем в файле, и получите его из вашего .gdbinit файла)

и на стороне приложения:

void gdb_run(char *str) {}


int main () {
    gdb_run("where");
}

Я думаю, что код прост, но, как я упоминал в https://stackoverflow.com/a/8884512/341106,, не все разрешено в обратном вызове stop, GDB находится в промежуточном состоянии, но многие вещи будут работать, как и ожидалось.

РЕДАКТИРОВАТЬ: Само собой разумеется, это не будет работать, если ваше приложение не скомпилировано с символами отладки!

1 голос
/ 27 января 2012

Можно ли управлять GDB из отлаженной программы?

Нет. Если бы программа могла это сделать и (скажем) отключить все точки останова, как бы вы отладили ее?

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

Это часто встречается в таком контексте: при N-м вызове foo() (локальная или глобальная) переменная bar неожиданно блокируется, и вы хотите найти виновника.

Если это действительно ваша проблема, тогда установите точку останова на строке, где вы знаете, что значение bar все еще в порядке (сразу после того, как оно было инициализировано). Установите для счетчика игнорирования (с помощью команды ignore) для этой точки останова значение N-1, а затем, когда достигается точка останова, установите для точки наблюдения значение bar.

Вы даже можете прикрепить команды к точке останова:

commands 1   # assuming this was the first breakpoint
 watch bar
 continue
end

, поэтому точка наблюдения прикрепляется автоматически.

...