Особенности национальной отладки Крис Касперски ака мыщъх Спецвыпуск: Хакер, номер #051, стр. 051-096-6 Пример использования ptrace // Подсчет кол-ва машинных команд в ls, для компиляции под Linux // замени PT_TRACE_ME на PTRACE_TRACEME, а PT_STEP на PTRACE_SINGLESTEP #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <errno.h> main() { int pid; // pid отлаживаемого процесса int wait_val; // сюда wait записывает возвращаемое значение long long counter = 1; // счетчик трассируемых инструкций
// расщепляем процесс на два // родитель будет отлаживать потомка // (обработка ошибок для наглядности опущена) switch (pid = fork()) { case 0: // дочерний процесс (его отлаживают) // папаша, ну-ка потрассируй меня! ptrace(PT_TRACE_ME, 0, 0, 0); // вызываем программу, которую надо оттрассировать // (для программ, упакованных "Шифрой", это не сработает) execl("/bin/ls", "ls", 0); break; default: // родительский процесс (он отлаживает) // ждем, пока отлаживаемый процесс // не перейдет в состояние останова wait(&wait_val); // трассируем дочерний процесс, пока он не завершится while (WIFSTOPPED(wait_val) /* 1407 */) { // выполнить следующую машинную инструкцию // и перейти в состояние останова if (ptrace(PT_STEP, pid, (caddr_t) 1, 0)) break; // ждем, пока отлаживаемый процесс // не перейдет в состояние останова wait(&wait_val); // увеличиваем счетчик выполненных // машинных инструкций на единицу counter++; } } // вывод количества выполненных машинных инструкций на экран printf("== %lld\n", counter); } Поддержка многопоточности в GDB Определить, поддерживает ли твоя версия GDB многогопоточность, можно при помощи команды info thread (вывод сведений о потоках), а для переключений между потоками используй thread N. Если поддержка многопоточности отсутствует, обнови GDB до версии 5x или установи специальный патч, поставляемый вместе с твоим клоном UNIX или распространяемый отдельно от него. Отладка многопоточных приложений не поддерживается (gdb) info threads (gdb) Отладка многопоточных приложений поддерживается 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 рассировка системных функций Перехват системных функций – это настоящее окно во внутренний мир подопытной программы, показывающее имена вызываемых функций, их аргументы и коды возврата. Отсутствие "лишних" проверок на ошибки - болезнь всех начинающих программистов, и отладчик – не самое лучшее средство их поиска. Воспользуйся одной из штатных утилит truss/ktrace или возьми любой бесплатный/коммерческий анализатор. |