Таким образом, в основном вы хотите записывать некоторые переменные, когда они записываются в/считывают/передают функции и т. Д.?
Выполнение этого с помощью скомпилированного С затруднено, как уже упоминалось, особенно если вы оптимизируете свой исполняемый файл (-0n в инструкции компиляции), и в этом случае некоторые из переменных могут полностью исчезнуть или повторно использоваться другими переменными ,
Использование GDB
Сказав это, я знаю, GDB может войти доступ к переменным и такого рода вещи. Если вы должны написать скрипт python (см. http://sourceware.org/gdb/onlinedocs/gdb/Python.html), вы должны будете написать сценарий для записи содержимого переменной.
Смотрите этот вопрос еще: Do specific action when certain breakpoint hits in gdb
По требованию только с использованием сценариев предварительной компиляции
В качестве альтернативы, если вы просто хотели сделать это по требованию, вы бы лучше с помощью предварительной обработки сценария для добавления в пользовательские макросы или подобное, используя CSV-файл в качестве входных данных:
for each line in CSV:
read variable_name, file_name, variable_type
find all occurrences of variable_name in file_name
for each occurrence
insert printf(....)
только по требованию, с помощью макросов
Удачи. Это не очень хороший способ сделать это, потому что вам обычно нужен какой-то поиск, и вам нужен способ выборочного вывода переменных в вашу функцию печати. В некоторых случаях вы могли бы сделать что-то вроде:
static char _LOGGED_VAR_001 = 'z';
static char _LOGGED_VAR_002 = 'z';
#define cMyVar _LOGGED_VAR_001
#define LOG_ALL_VARS() printf("Vals: %c, %c", _LOGGED_VAR_001, _LOGGED_VAR_002)
void myFunc()
{
char cMyVar; // Gets macro'd to _LOGGED_VAR_001 with LOCAL scope
cMyVar = 'a'; // LOCAL scope _LOGGED_VAR_001 becomes 'a'
LOG_ALL_VARS(); // At this point you print out the LOCAL _LOGGED_VAR_001
// and the global _LOGGED_VAR_002
}
Вы получили бы Vals: a, z
Это очень некрасиво, будет работать только для переменных с локальной областью, портит круглый с потреблением памяти, может быть подвержен ошибкам и обычно Плохая идея.
По требованию, куча/дамп стека
Если у вас есть достаточно места, вы можете сбросить всю память по требованию в файл. Вероятно, это было бы не очень портативно, в зависимости от того, как это было сделано. Я не уверен, как это сделать, но надежным образом.
Рекомендация
Использование GDB для диагностики во время разработки. Это то, для чего он предназначен:
Для (например) анализа выпущенного кода (автоматические отчеты об ошибках) может потребоваться полная дампа, а затем анализ по желанию.
Мне нужно иметь динамические отладочные сообщения в моей программе на C. У меня есть файл, который содержит каждую переменную функции, которую я хочу напечатать. Я читаю этот файл и сохраняю имя переменных в переменной, называемой, например, L_sVarName, поэтому L_sVarName имеет имя переменной, которую я хочу напечатать. Вот почему я отправляю мой вопрос L_sVarName =»L_sName»/* переменная в файле, который я хочу, чтобы напечатать */ L_sName =»ABC» Так мне нужно найти способ, чтобы напечатать переменную L_sName значение «ABC» от L_sVarName –