#c #windows #linux #debugging
#c #Windows #linux #отладка
Вопрос:
Я хотел бы подключить мой скомпилированный объектный код к коду c , а затем проверить, была ли выполнена определенная строка кода. Как выполнить эти две вещи?
Если объяснение не простое (бьюсь об заклад, что это не так), может кто-нибудь хотя бы указать на некоторые веб-страницы, объясняющие, как это сделать?
Я понимаю, что решение отличается для разных платформ, но мне интересно, как это делается в Windows и linux (linux для начала)
Комментарии:
1. Почему бы просто не использовать существующие отладчики?
2. @Erik Я знаю, что отладчики очень сложные, и я не заинтересован в их создании. Я просто хотел бы собрать информацию о том, как проверить, какие методы / функции выполняются во время выполнения и сколько раз.
3. Что это за «скомпилированный объектный код»? В зависимости от вашего уровня контроля, это может быть так же просто, как добавить инструкцию printf () до / после строки кода, о которой вы хотите знать. С другой стороны, вы можете захотеть изучить, как переопределять функции на выбранной вами платформе (иногда называемой swizzling). На многих платформах вы можете заменить запись функции в таблице компоновщика своей собственной функцией, выполнить свой printf, а затем вызвать оригинал. В худшем случае вы могли бы также заменить первую машинную инструкцию функции инструкцией перехода.
Ответ №1:
Если вы хотите знать, как это делается,
- gdb имеет открытый исходный код
ptrace
системный вызов должен помочь вам начать,- libunwind-ptrace
это хорошая статья с использованием ptrace
Ответ №2:
Я подозреваю, что вам на самом деле нужен не отладчик, а профилировщик. Мне нравится callgrind в http://valgrind.org/docs/manual/cl-manual.html , который имеет приятную графическую среду на http://kcachegrind.sourceforge.net /.
Чтобы попробовать, я бы использовал
$ valgrind --tool=callgrind ./myapp
$ kcachegrind callgrind.out.xxx
Комментарии:
1. Это не совсем то, что я искал, но valgrind имеет открытый исходный код. Итак, спасибо за совет 🙂
Ответ №3:
В своем комментарии вы говорите «Я просто хотел бы собрать информацию о том, как проверить, какие методы / функции выполняются во время выполнения и сколько раз».
Если это то, чего вы хотите достичь, тогда используйте профилировщик, такой как gprof.
Скомпилируйте свою программу с помощью -g -pg, и когда ваша программа завершит работу, она создаст файл, который может быть обработан gprof, чтобы показать вам, что вы хотите.
Комментарии:
1. Правильно, но я хочу сделать это из своего приложения — без необходимости компилировать библиотеку или программу с дополнительными опциями (-pg для gcc).