Как использовать строковое значение в качестве имени файла журнала - PullRequest
1 голос
/ 14 января 2020

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

Я пытался задать имя файла журнала непосредственно в файле GDB:

break test.c:95
  commands
  silent

  # Set the logging file
  set $_file=(char*)malloc(64)
  call snprintf($_file, 64, "~/path/to/logging/file_%04d.txt", i) # i is the for variable
  set logging file $_file
  call free($_file)

  set logging redirect on
  set pagination off
  set logging overwrite on
  set logging on

  set $_data=array

  set $_x=0
  while ($_x<2000)
    set $_y=0
    while ($_y<2000)
      printf "%f    ", $_data[$_x][$_y]
      set $_y++
    end
    printf "\n"
    set $_x++
  end

  # Log default setup
  set logging off
  set logging redirect off
  set logging overwrite off
  set pagination on

  continue
end

Но GDB создал файл $_file в моем рабочем каталоге вместо чтения значения переменной.

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

Наконец, я попытался поместить код отладки в функцию gdb и дать fileName в качестве аргумента функции, но, как и ранее, он не интерпретирует строку.

Мой вопрос С помощью GDB, как я могу использовать значение C -строки в качестве имени файла журнала?

Ответы [ 2 ]

3 голосов
/ 14 января 2020

Вы можете использовать eval для вставки значения переменных в команды GDB. В вашем случае имя файла журнала может быть установлено на $_file с помощью команды:

eval "set logging file %s", $_file

Также вы можете использовать dump, если вы хотите сбросить array в fileName с помощью GDB встроенные команды:

eval "dump value %s array", fileName

Примечание: выгружаемое значение является двоичным.

1 голос
/ 14 января 2020

Но GDB создал файл $ _file в моем рабочем каталоге вместо чтения значения переменной.

Похоже, в GDB set logging file отсутствует eval его аргумент. Для этого вам следует подать запрос на запрос функции bugzilla.

Если ваша GDB построена со встроенным Python, вы можете тривиально сделать то, что вы хотите, прикрепив команду Python к точке останова.

...