Как написать простой отладчик?

#c #windows #linux #debugging

#c #Windows #linux #отладка

Вопрос:

Я хотел бы подключить мой скомпилированный объектный код к коду c , а затем проверить, была ли выполнена определенная строка кода. Как выполнить эти две вещи?

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

Я понимаю, что решение отличается для разных платформ, но мне интересно, как это делается в Windows и linux (linux для начала)

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

1. Почему бы просто не использовать существующие отладчики?

2. @Erik Я знаю, что отладчики очень сложные, и я не заинтересован в их создании. Я просто хотел бы собрать информацию о том, как проверить, какие методы / функции выполняются во время выполнения и сколько раз.

3. Что это за «скомпилированный объектный код»? В зависимости от вашего уровня контроля, это может быть так же просто, как добавить инструкцию printf () до / после строки кода, о которой вы хотите знать. С другой стороны, вы можете захотеть изучить, как переопределять функции на выбранной вами платформе (иногда называемой swizzling). На многих платформах вы можете заменить запись функции в таблице компоновщика своей собственной функцией, выполнить свой printf, а затем вызвать оригинал. В худшем случае вы могли бы также заменить первую машинную инструкцию функции инструкцией перехода.

Ответ №1:

Если вы хотите знать, как это делается,

это хорошая статья с использованием 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).