Compare commits
2 Commits
d7f2db8780
...
734e183c67
| Author | SHA1 | Date | |
|---|---|---|---|
| 734e183c67 | |||
| 4af9e13120 |
@ -2,3 +2,13 @@
|
|||||||
|
|
||||||
## Отладчик
|
## Отладчик
|
||||||
|
|
||||||
|
Всю основу написания отладчиков на Linux держит на своих плечах один единственный систенмый вызов - ptrace ("process trace"). Он позволяет выполнять все то, что мы привыкли делать в дебаггере - шаг с обходом, шаг с заходом, просмотр регистров, мучения оперативы и прочие радости отладки. Как тут помочь не знаю, потому что подробный гайд займет целую статью. Предложение простое - почитать великую статью по написанию (первые 2 части покроют весь материал этой лабы): https://blog.tartanllama.xyz/writing-a-linux-debugger-setup/
|
||||||
|
|
||||||
|
В основном пробелмы будут сопряжены только с чтением того, что вообще может делать ptrace, а может он почти все, что нас инетерсует, тольк вот интерфейс у него мягко скажем не по solid.
|
||||||
|
|
||||||
|
Внутри своего кода я ввел специальный макрос `DONT_CARE`, который призван сигнализировать о том, что при определенном флаге некоторые поля будут игнорироваться.
|
||||||
|
|
||||||
|
В остальном удачи и учтите, что программа останавливается как-то по своей логике, а не по логике обычного человека. Она остановится не в момент ptrace (PTRACE_TRACEME, ...), а в момент execv. Почему так? да фиг его знает если честно. Скорее всего просто в этот момент программа посылает сигнал о том, что образ потока был переписан. Других идей у меня нет.
|
||||||
|
|
||||||
|
Собственно именно поэтому continue прожималось мной 2 раза, а не один, как хотелось бы верить по логике
|
||||||
|
|
||||||
|
|||||||
@ -52,6 +52,7 @@ int main()
|
|||||||
continue_execution(pid);
|
continue_execution(pid);
|
||||||
if (stats & SIGTRAP)
|
if (stats & SIGTRAP)
|
||||||
{
|
{
|
||||||
|
printf("--BREAKPOINT--\n");
|
||||||
while (stats != 0)
|
while (stats != 0)
|
||||||
{
|
{
|
||||||
read(0, &buff, 1);
|
read(0, &buff, 1);
|
||||||
@ -60,7 +61,7 @@ int main()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("____AFTER_TRACE_PARRENT____\n");
|
printf("____PROCESS_WAS_TERMINATED____\n");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user