Compare commits
2 Commits
d7f2db8780
...
labs/08
| 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);
|
||||
if (stats & SIGTRAP)
|
||||
{
|
||||
printf("--BREAKPOINT--\n");
|
||||
while (stats != 0)
|
||||
{
|
||||
read(0, &buff, 1);
|
||||
@ -60,7 +61,7 @@ int main()
|
||||
}
|
||||
}
|
||||
|
||||
printf("____AFTER_TRACE_PARRENT____\n");
|
||||
printf("____PROCESS_WAS_TERMINATED____\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user