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

Предпосылки и контекст:
Я делаю небольшой проект на Chromium, и я работаю над функцией
который компилирует код JS, полученный в качестве параметра.

Я смог взять тип с кодом JS и создать из него
Строка C ++ (или C char *) с кодом.

Проблема, с которой я сталкиваюсь, заключается в создании чего-то оригинального
в котором был код JS, я искал в файлах Chromium
для строки, которая создает этот тип, и я не нашел ту, которая принимает
код (как символ * или строка) и создает этот тип с кодом —
как параметр, который получает функция.

Что я ищу:
Чтобы лучше понять, как это изначально
функция получает этот параметр (поэтому я смогу создать его сам)
Я ищу инструмент для C / C ++, который может сказать мне для данной функции,
или параметр для данной функции, который передал этот параметр, кто
передал его тому, кто передал функции (и т. д.)
и, наконец, кто его создал (желательно, какая строка в коде)

Кто-нибудь знает такой инструмент? любая помощь очень ценится!

1

Решение

Вы можете обернуть свою функцию макросом, который может помочь в извлечении вызывающей стороны.
Например, если изначально у вас есть подпись функции void foo(int param1, int param2);вместо этого вы можете определить:

#define foo(param1, param2) fooEx(param1, param2, __FUNCTION__)
void fooEx(int param1, int param2, const char* caller);

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

1

Другие решения

По крайней мере одна «черновая» идея заключается в использовании Отладчик GNU (GDB) с точками разрыва и трассировки стека. Возможно с проверкой условий. Также в этом случае может пригодиться возможность присоединения к запущенному процессу.
Не могли бы вы объяснить более подробно, если я не очень хорошо поняла ваши вопросы?

0

Для большего понимания вы можете использовать valgrind (http://en.wikipedia.org/wiki/Valgrind). Это поможет вам в отладке, обнаружении утечек памяти и профилировании (которое расскажет вам, как вызывается эта функция с какими параметрами) вашего кода C / C ++.

0

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

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

Обратите внимание, что это не всегда прямо говорит вам, «откуда появился параметр»: каждая функция в графе вызовов может каким-то образом манипулировать данными, поэтому вам все равно придется смотреть на каждый фрагмент кода, обрабатывающий данные.

0

Компетентная среда разработки (я знаю, Visual Studio делает это, поэтому другие также должны быть доступны) должна быть в состоянии показать вам статически известные входящие вызовы функции. Надеюсь, их не так много, и вы сможете оттуда идти назад.

Если это не сработает (т.е. у вас нет IDE, которая обрабатывает это, или есть слишком много вызывающих), вы, вероятно, застряли с отладчиком и точками останова для проверки стека вызовов.

0