Сброс памяти в gdb - как выбрать имя файла во время выполнения - PullRequest
1 голос
/ 10 августа 2009

Я запускаю программу, которая выполняет обработку файла. Я хочу иметь возможность снабдить программу несколькими файлами, и, прикрепив к ней gdb, я хочу получить дамп памяти в определенный момент кода для каждого из файлов. Я хочу, чтобы дамп для каждого файла шел в файл с тем же именем файла, что и входной файл (возможно, после небольшого форматирования, скажем, добавив суффикс)

Итак, предположим, что у меня есть функция с именем HereIsTheFileName (char * filename) и другая функция с именем DumpThisMemoryRegion (void * startAddr, void * endAddr), я хочу сделать что-то вроде следующего:

Чтобы получить имя файла для переменной среды:

  • break ЗдесьIsTheFileName
  • команды 1
  • set $ filename = malloc (strlen (filename) + 1)
  • call memcpy ($ filename, filename, strlen (filename) + 1)
  • конец

Затем, чтобы сбросить память в файл, который я сохранил ранее:

  • break DumpThisMemoryRegion
  • команды 2
  • добавление двоичной памяти "% s.memory"% $ filename startAddr endAddr
  • конец

(я бы даже согласился на имя файла без его форматирования, если это окажется трудной частью)

Однако я не мог заставить gdb принимать что-либо, кроме явного имени файла для команд append / dump. когда я запустил «добавить двоичную память $ filename ...», я получил вывод в файле «/ workdir / $ filename». Есть ли способ заставить GDB выбирать имя файла во время выполнения?

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 августа 2009

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

Поместив это в ваш ~ / .gdbinit

define reallyappend
  printf "using gdbtmp.log to dump memory to file %s\n", $arg0
  set logging file gdbtmp.log
  set logging overwrite on
  set logging redirect on
  set logging on
  printf "append binary memory %s 0x%x 0x%x", $arg0, $arg1, $arg2
  set logging off
  set logging redirect off
  set logging overwrite off
  source gdbtmp.log
end

вместо этого вы можете использовать функцию realappend, например, с

(gdb) set $filename = "somethingruntimegenerated"
(gdb) reallyappend $filename startAddr endAddr

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

0 голосов
/ 09 октября 2009

Да, здесь нельзя использовать переменную для аргумента имени файла. Лучшее предложение, которое я могу предложить, - написать сценарий, который будет установите все точки останова и настройте команды добавления, и используйте редактирование текста или awk и sed, чтобы установить имена файлов в сценарий.

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