Эльфы большие и маленькие

         

Отладка ассемблерных программ— ночной кошмар


Редкая программа начинает работать сразу же после запуска. Практически всегда она содержит ошибки, требующие отладки. Высокоуровневые программисты находятся в более выгодном положении, поскольку значительная часть ошибок отсеивается компилятором еще на стадии трансляции, к тому же сам синтаксис языка делает программу намного более выразительной. Одиночные ассемблерные команды в отрыве от своего окружения — абсолютно бессмысленны и обнаружить ошибку путем визуального просмотра листинга очень тяжело.

Отладка ассемблерных программ — это тот вопрос, который большинство составителей tutorial'ов предпочитают обходить стороной. Существует даже мнение, что нормальных отладчиков под UNIX вообще нет, а "великий и могучий" gdb ассемблер не переваривает  в принципе (http://www.wasm.ru/comment.php?artcode=asmunixlot).

Что ж! Давайте посмотрим, насколько это утверждение близко к истине. Пропустим ассемблерную программу через gcc, но на этот раз не будем удалять символьную информацию, которая, собственно говоря, для отладчика и предназначена.

Загружаем elf_libc в gdb ("gdb elf_libc"), тут же брякаемся на main ("b main"), запускаем программу командой "r" и, дождавшись срабатывания точки останова, пробуем трассировать (команда "s" — трассировка без захода в функции, "n" – с заходом). Отладчик тут же слетает с катушек, ругаясь на отсутствие информации о номерах строк. Оба на!

И хотя отладка на ассемблерном уровне (не путать с уровнем исходных текстов!) все-таки доступна (даем команду "display/i $pc" для отображения ассемблерных мнемоник и ведем трассировку командами "si" и "ni" соответственно), но в этом случае мы теряем всю информацию об именах функций, метках, переменных, короче говоря, львиная доля смысла листинга уходит в никуда. Вот тут кто-то говорит, а какая нам, собственно, разница? Ведь ассемблерные команды одни и те же, ну а без имен и меток мы как ни будь переживем. Ага!!! Попробуйте отладить реальную программу, а не учебный пример, сразу же взвоете! Нет, надо действовать не так!



Содержание раздела