Здравствуйте, artem_korneev, Вы писали:
_>Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов. _>Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?
_>Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют?
_>Самому пока на ум приходят какие-то кривоватые варианты с перегрузкой оператора вызова ().
Здравствуйте, artem_korneev, Вы писали:
_>Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов. _>Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?
_>Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют?
Ну раз уж ты упомянул gdb, то, наверное, ты и собираешь gcc? Если так, то у него есть функция для доступа к стеку: backtrace.
ну а чтоб потом привести его в читабельный вид, напусти на него abi::__cxa_demangle.
Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов.
Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?
Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют?
Самому пока на ум приходят какие-то кривоватые варианты с перегрузкой оператора вызова ().
С уважением, Artem Korneev.
Re[2]: Как определить, откуда была вызвана функция?
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, artem_korneev, Вы писали:
_>>Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов. _>>Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?
_>>Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют? J>Ну раз уж ты упомянул gdb, то, наверное, ты и собираешь gcc? Если так, то у него есть функция для доступа к стеку: backtrace.
поправочка: вообщето backtrace из glibc
J>ну а чтоб потом привести его в читабельный вид, напусти на него abi::__cxa_demangle.
тока не забываем что то что возвращает backtrace_symbols нельзая подавать в abi::__cxa_demangle -- нада ее чучуть попарсить перед этим...
Думаю стоит глянуть в сторону valgrind/callgrind
Здравствуйте, artem_korneev, Вы писали:
_>Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов. _>Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?
_>Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют?
_>Самому пока на ум приходят какие-то кривоватые варианты с перегрузкой оператора вызова ().
Re[3]: Как определить, откуда была вызвана функция?
Здравствуйте, zaufi, Вы писали:
J>>Ну раз уж ты упомянул gdb, то, наверное, ты и собираешь gcc? Если так, то у него есть функция для доступа к стеку: backtrace. Z>поправочка: вообщето backtrace из glibc
а glibc — это разве не gcc-specific библиотека?
J>>ну а чтоб потом привести его в читабельный вид, напусти на него abi::__cxa_demangle. Z>тока не забываем что то что возвращает backtrace_symbols нельзая подавать в abi::__cxa_demangle -- нада ее чучуть попарсить перед этим...
ну, я этим все равно не пользуюсь, ибо тормозит, просто складываю вывод backtrace в файл как есть, и потом прогоняю файл через c++filt, если нужно.
Z>а вопщем поиск рулит: здесь
Здравствуйте, jazzer, Вы писали:
J>>>Ну раз уж ты упомянул gdb, то, наверное, ты и собираешь gcc? Если так, то у него есть функция для доступа к стеку: backtrace. Z>>поправочка: вообщето backtrace из glibc J>а glibc — это разве не gcc-specific библиотека?
Не совсем glibc может собираться разными компиляторами.