поиск номера строки конца функции - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь автоматизировать отладку, распечатывая входные и выходные данные функции через GDB, когда эта функция срабатывает. Чтобы разрешить установку точек останова в этих местах, я делаю следующее. Я работаю с шаблонами, и rbreak:. не попадает в точки останова функций в моем файле. Итак, я извлекаю номера строк функций из исполняемого файла следующим образом:

  1. С исполняемым файлом извлекаю номер начала функции;

nm a.out | grep "className" | grep "functionName" | grep "t" | addr2line -e a.out -f | grep "cpp" | uniq

-> this outputs the filename:linenumber
добавить это содержимое в файл .gdb с префиксом b

Запрос - как мы можем извлечь номер строки конца функции из исполняемого файла ?

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

b filepath:<startline of function>
commands
print input1 input2 etc
continue 
end

b filepath:<endline of function>
commands
print output1 output2 etc
continue 
end

Осталось найти только конечную строку данной функции , принадлежащую классу / файлу , учитывая исполняемый файл и начальную строку функции

, я также рассматривал возможность использования команды GDBs fini sh, но управление уже вернулось к вызывающей стороне. было бы легко иметь отпечатки внутри вызываемой функции вместо вызывающей, чтобы мы могли контролировать ввод / вывод каждого вызова функции. Это значительно упростит мою отладку.

Любые предложения / комментарии приветствуются. Заранее большое спасибо !!

1 Ответ

0 голосов
/ 08 мая 2020

Во-первых, обратите внимание, что функции шаблона - это не функции, а на самом деле рецепты. Когда вы используете шаблон, компилятор генерирует функцию из шаблона.

Если вы хотите использовать команду break, вам нужно полное имя функции. Например, шаблон ниже

template <typename T>
inline T doubleInput(const T& x) {
    return 2 * x;
}

станет функцией doubleInput<int>, когда вы передадите int, doubleInput<double>, когда вы передадите double, et c. Вам нужно полное имя, включая часть <type>, чтобы добавить точку останова с помощью команды break, и даже в этом случае она остановится только в этом конкретном случае шаблона.

Но команда rbreak работает с шаблонами. Если вы напишете в gdb rbreak doubleInput*, то точка останова будет добавлена ​​в все существующие специализации шаблона.

См. ответ на этот вопрос .


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

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