Re: Как определить, откуда была вызвана функция?
От: Bell Россия  
Дата: 24.04.08 09:49
Оценка: 4 (1)
Здравствуйте, artem_korneev, Вы писали:

_>Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов.

_>Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?

_>Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют?


_>Самому пока на ум приходят какие-то кривоватые варианты с перегрузкой оператора вызова ().


Если речь о Win, то начни отсюда
Любите книгу — источник знаний (с) М.Горький
Re: Как определить, откуда была вызвана функция?
От: jazzer Россия Skype: enerjazzer
Дата: 24.04.08 09:52
Оценка: 2 (1)
Здравствуйте, artem_korneev, Вы писали:

_>Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов.

_>Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?

_>Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют?

Ну раз уж ты упомянул gdb, то, наверное, ты и собираешь gcc? Если так, то у него есть функция для доступа к стеку: backtrace.
ну а чтоб потом привести его в читабельный вид, напусти на него abi::__cxa_demangle.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Как определить, откуда была вызвана функция?
От: artem_korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 24.04.08 09:45
Оценка:
Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов.
Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?

Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют?

Самому пока на ум приходят какие-то кривоватые варианты с перегрузкой оператора вызова ().
С уважением, Artem Korneev.
Re[2]: Как определить, откуда была вызвана функция?
От: zaufi Земля  
Дата: 25.04.08 11:45
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, artem_korneev, Вы писали:


_>>Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов.

_>>Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?

_>>Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют?

J>Ну раз уж ты упомянул gdb, то, наверное, ты и собираешь gcc? Если так, то у него есть функция для доступа к стеку: backtrace.
поправочка: вообщето backtrace из glibc

J>ну а чтоб потом привести его в читабельный вид, напусти на него abi::__cxa_demangle.

тока не забываем что то что возвращает backtrace_symbols нельзая подавать в abi::__cxa_demangle -- нада ее чучуть попарсить перед этим...

а вопщем поиск рулит: здесь
Автор: zaufi
Дата: 05.04.06
и здесь
Автор: zaufi
Дата: 02.04.08
Re: Как определить, откуда была вызвана функция?
От: brovushkin Украина  
Дата: 26.04.08 12:41
Оценка:
Думаю стоит глянуть в сторону valgrind/callgrind
Здравствуйте, artem_korneev, Вы писали:

_>Захотелось мне в целях отладки собрать некоторую информацию о вызовах функций. Хотябы имена. В идеале — ещё и адрес вызывающего объекта и номер строки кода, откуда был сделан вызов.

_>Можно ли как-то из функции определить это, используя бинарник, собранный с отладочной информацией?

_>Отладчик (тот же gdb) в может вывести содержимое стека, указывая имена вызывающих функций. Можно ли сделать тоже самое? Может есть какие-либо библиотеки для отладки, которые это позволяют?


_>Самому пока на ум приходят какие-то кривоватые варианты с перегрузкой оператора вызова ().
Re[3]: Как определить, откуда была вызвана функция?
От: jazzer Россия Skype: enerjazzer
Дата: 28.04.08 01:29
Оценка:
Здравствуйте, 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>а вопщем поиск рулит: здесь
Автор: zaufi
Дата: 05.04.06
и здесь
Автор: zaufi
Дата: 02.04.08


jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Как определить, откуда была вызвана функция?
От: Cyberax Марс  
Дата: 28.04.08 02:28
Оценка:
Здравствуйте, jazzer, Вы писали:

J>>>Ну раз уж ты упомянул gdb, то, наверное, ты и собираешь gcc? Если так, то у него есть функция для доступа к стеку: backtrace.

Z>>поправочка: вообщето backtrace из glibc
J>а glibc — это разве не gcc-specific библиотека?
Не совсем glibc может собираться разными компиляторами.
Sapienti sat!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.