Категория > Новости > Отладка программ без исходников. Анализируем двоичные файлы в Linux штатными средствами - «Новости»
Отладка программ без исходников. Анализируем двоичные файлы в Linux штатными средствами - «Новости»2-12-2022, 00:00. Автор: Татьяна |
издательством БХВ решило адаптировать под современные реалии еще одну книгу Криса Касперски — «Техника отладки программ без исходных текстов». Время идет, и знания устаревают, но описанные в книге технологии востребованны до сих пор. Мы актуализируем сведения обо всех упоминаемых Крисом программных продуктах: об операционных системах, компиляторах, средствах кодокопания. А самое главное, будет обновлена аппаратная платформа с IA-32 на AMD64: именно этот переход в большей степени повлиял на трансформацию программного обеспечения. Чтобы оптимизировать приложение для новой архитектуры, нужно использовать новые возможности языка ассемблера и современные команды подсистемы работы с памятью. Все эти нюансы будут учтены в обновленной версии издания. Читайте также - Массаж разработан для спортсменов с целью улучшения физических способностей, делается в очень интенсивном темпе. Процедура поможет ускорить выведение молочной кислоты после интенсивных тренировок, лфк массаж по доступным ценам. Особенности отладки в LinuxПервое знакомство с GDB (что‑то вроде Несколько строчек исходного кода UNIX еще помнят те древние времена, когда ничего похожего на интерактивную отладку не существовало и единственным средством борьбы с ошибками был аварийный дамп памяти. Программистам приходилось месяцами (!) ползать по вороху распечаток, собирая рассыпавшийся код в стройную картину. Чуть позже появилась отладочная печать — операторы вывода, понатыканные в ключевых местах и распечатывающие содержимое важнейших переменных. Если происходит сбой, простыня распечаток (в просторечии — «портянка») позволяет установить, чем занималась программа до этого и кто именно ее так покорежил. Отладочная печать сохранила свою актуальность и по сей день. В мире Windows она в основном используется лишь в отладочных версиях программы и убирается из финальной, что не очень хорошо: когда у конечных пользователей происходит сбой, в руках остается лишь аварийный дамп, на котором далеко не уедешь. Согласен, отладочная печать кушает ресурсы и отнимает время. Вот почему в UNIX так много систем управления протоколированием — от стандартного syslog до продвинутого Enterprise Event Logging. Они сокращают накладные расходы на вывод и журналирование, значительно увеличивая скорость выполнения программы. Вот неправильный пример использования отладочной печати:
А вот — правильный пример использования отладочной печати:
Отладочная печать на 80% устраняет потребности в отладке, ведь отладчик используется в основном для того, чтобы определить, как ведет себя программа в конкретном месте: выполняется условный переход или нет, что возвращает функция, какие значения содержатся в переменных и т. д. Просто влепи сюда Человек — не слуга компьютера! Это компьютер придуман для автоматизации человеческой деятельности (в мире Windows — наоборот), поэтому Linux «механизирует» поиск ошибок настолько, насколько это только возможно. Включи максимальный режим предупреждений компилятора или возьми автономные верификаторы кода (также известные как статические анализаторы), и баги побегут из программы, как мыщъхи с тонущего корабля. Исторически самый первый статический анализатор кода — LINT — дал имя всем его последователям — линтеры. Windows-компиляторы тоже могут генерировать сообщения об ошибках, по строгости не уступающие GCC, но большинство программистов пропускает их. Культура программирования, блин! Существует множество линтеров, как коммерческих, так и свободных, проприетарных и с открытым исходным кодом. Например, популярный статический анализатор кода Чтобы установить CppCheck в Ubuntu, достаточно ввести в консоль команду sudo apt-get install cppcheck Теперь можно проверять файлы с кодом на наличие потенциальных ошибок. Не мудрствуя лукаво, напишем код с глупой ошибкой: int main() { int *i = new int(); char *c = (char*)malloc(sizeof(char)); } Запустим линтер: cppcheck second.cpp Рассмотрим другой пример: cppcheck first.cpp Рекомендуется прогонять код под несколькими линтерами, так как все они работают по‑разному, следовательно, каждый из них может обнаружить собственный набор ошибок. Пошаговое выполнение программы и контрольные точки останова в Linux используются лишь в клинических случаях (типа трепанации черепа), когда все остальные средства оказываются бессильными. Поклонникам Windows такой подход кажется несовременным, ущербным и жутко неудобным, но это все потому, что Windows-отладчики эффективно решают проблемы, которые в Linux просто не возникают. Разница культур программирования между Windows и Linux в действительности очень и очень значительна, поэтому прежде, чем кидать камни в чужой огород, наведи порядок у себя. Непривычное еще не означает неправильное. Точно такой же дискомфорт ощущает матерый линуксоид, очутившийся в Windows. PTrace — фундамент для GDBGDB — это системно независимый кросс‑платформенный отладчик. Как и большинство Linux-отладчиков, он основан на библиотеке PTrace, реализующей низкоуровневые отладочные примитивы. Для отладки многопоточных процессов и параллельных приложений рекомендуется использовать дополнительные библиотеки, поскольку GDB с многопоточностью справляется не лучшим образом. Среди софта для отладки многопоточных приложений особую популярность завоевал TotalView. Этот программный пакет используется для отладки программ на суперкомпьютерах, посему он не по карману простым смертным. Внешний вид отладчика TotalView, специализирующегося на параллельных приложениях PTrace может переводить процесс в состояние останова и возобновлять его выполнение, читать и записывать данные в адресном пространстве отлаживаемого процесса, читать и записывать регистры центрального процессора. На архитектуре x86-64 это регистры общего назначения, сегментные регистры (доставшиеся ей по наследству), регистры SSE и отладочные регистры семейства DRx (они нужны для организации аппаратных точек останова). В Linux еще можно манипулировать служебными структурами отлаживаемого процесса и отслеживать вызов системных функций. В «оригинальном» UNIX этого нет, и недостающую функциональность приходится реализовывать уже в отладчике. Вот пример использования PTrace в Linux: #include <stdlib.h>#include <signal.h>#include <sys/ptrace.h>#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>#include <errno.h>int main(){ В результате выполнения этого приложения на моей машине в консоль передается следующий вывод. Вывод приложения ptrace_test PTrace и его командыВ user-mode доступна всего лишь одна функция: ptrace((int _request, pid_t _pid, caddr_t _addr, int _data)) Но зато эта функция делает все! При желании ты можешь за пару часов написать собственный мини‑отладчик, специально заточенный под конкретную проблему. Аргумент
Поддержка многопоточности в GDBОпределить, поддерживает ли твоя версия GDB многопоточность или нет, можно при помощи команды info thread Она выводит сведения о потоках, а для переключений между потоками используй следующую команду: thread N Поддерживается отладка многопоточных приложений: info threads 4 Thread 2051 (LWP 29448)RunEuler (lpvParam=0x80a67ac)at eu_kern.cpp:633 3 Thread 1026 (LWP 29443)0x4020ef14 in __libc_read ()from /lib/libc.so.6 * 2 Thread 2049 (LWP 29442)0x40214260 in __poll (fds=0x80e0380,nfds=1,timeout=2000) 1 Thread 1024 (LWP 29441)0x4017caea in __sigsuspend (set=0xbffff11c) (gdb)thread 4 Краткое руководство по GDBGDB — это консольное приложение, выполненное в классическом духе командной строки. Внешний вид отладчика GDB И хотя за время своего существования GDB успел обрасти ворохом красивых графических морд (среди них DDD, Data Display Debugger, — старейший и самый популярный интерфейс), интерактивная отладка в стиле WinDBG в мире Linux крайне непопулярна. Отладчик DDD — графический интерфейс к GDB Как правило, это удел эмигрантов с Windows-платформы, сознание которых необратимо искалечено идеологией «окошек». Грубо говоря, если WinDBG — слесарный инструмент, то GDB — токарный станок с программным управлением. Когда‑нибудь ты полюбишь его. Перейти обратно к новости |