Я часто отлаживаю числовые подпрограммы на C. Это означает, что я запускаю программу с помощью gdb и перехожу к функции, которую нужно отладить. Затем я сравниваю числовые значения с моими ожиданиями, распечатывая переменные с помощью gdb. Очевидно, эта процедура утомительна для более длительных процедур. В частности, мне нужно запоминать значения различных переменных между последующими запусками, если я изменяю процедуру и хочу сравнить с предыдущими результатами. В некоторых случаях очень помогло бы (особенно, если подпрограмма более или менее линейна), если бы у меня был инструмент, который автоматически заменяет переменные их числовыми значениями, встречающимися во время выполнения. Например. короткий (тривиальный) пример процедуры
myfunc(double a, double b)
{
double tmp_a, tmp_b, c;
tmp_a = a*a;
tmp_b = b*b;
c = sqrt(tmp_a+tmp_b);
return c;
}
может быть преобразован в
myfunc(double a<1.0>, double b<2.0>)
{
double tmp_a, tmp_b, c;
tmp_a = a<1.0>*a<1.0>;
tmp_b = b<2.0>*b<2.0>;
c = sqrt(tmp_a<1.0>+tmp_b<4.0>);
return c<2.236067977499789696e+00>;
}
Я мог легко сравнить результаты последующих запусков с помощью инструмента сравнения. Также я мог сравнивать промежуточные численные результаты с результатами произвольной точности, вставляя результат в систему компьютерной алгебры. Приблизительная идея состоит в том, что драйвер gdb выполняет двоичный файл до указанной процедуры, выполняет ее шаг за шагом (каждый раз заменяя все переменные в шаге их соответствующими значениями в это время) и, наконец, завершает работу. Подсказки к существующему программному обеспечению или идеи для реализации приветствуются. Возможно, есть решение, основанное на perl, использующее существующие интерфейсы gdb, такие как Devel::GDB
(не уверен, что этот достаточно взрослый).
Похоже, что начиная с версии 7 gdb поддерживает скрипты python. Мне был бы очень полезен минимальный пример, который загружает однопоточный исполняемый файл, устанавливает точку останова, запускает исполняемый файл и печатает значение переменных после достижения точки останова.
a/*1.0*/
, поскольку это, по крайней мере, позволило бы создать исходный код. - person unwind   schedule 20.02.2013