Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #51, ФЕВРАЛЬ 2005 г.

Особенности национальной отладки

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #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 или возьми любой бесплатный/коммерческий анализатор.

Назад на стр. 051-096-5  Содержание  Вперед на стр. 051-096-7