Отслеживать все вызовы из программы?

#c #linux #trace

#c #linux #трассировка

Вопрос:

Программа установлена на 2 компьютерах. Определенная библиотека корректно работает на одном компьютере, но совсем не работает на другом. Интересно, отсутствует ли библиотека.

Я использую strace, чтобы видеть, какие библиотеки вызываются программой во время выполнения. Все библиотеки, упомянутые strace, верны, но определяет ли strace также, вызывает ли одна библиотека другую библиотеку или файл? Есть какой-нибудь способ обнаружить этот сценарий?

Ответ №1:

Да, strace обнаружит вызовы из загруженных библиотек.

Если вы хотите отслеживать вызовы библиотеки (не системные), используйте ltrace

Ответ №2:

Похоже, вы хотите просмотреть график вызовов функций вашего приложения, то есть какие функции вызывают друг друга, в какой библиотеке они находятся и т.д. Если это так, возможно, вы захотите проверить инструмент callgrind (который является частью valgrind).

Вот пример, который использует callgrind для профилирования некоторого кода.

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

Комментарии:

1. Ссылка на stanford защищена паролем :(.

Ответ №3:

Чтобы проверить, отсутствуют ли библиотеки, запустите ldd /full/path/to/program

Ответ №4:

Для программ, использующих Clang для компиляции, попробуйте получить трассировку вызовов программ с помощью Xray . Он эвристически обрабатывает часть программы и имеет очень низкие издержки во время выполнения.