but then how does debugger 'know' what it is being attached to?
de homem ptrace
The ptrace() system call provides a means by which one process (the
"tracer") may observe and
control the execution of another process (the "tracee"), and examine and change the tracee's
memory and registers. It is primarily used to implement breakpoint debugging and system call
tracing.
Como funcionam os depuradores Parte 1 de 3 é uma boa referência para usar ptrace , a chamada do sistema de depuração.
Muito brevemente, porque o gdb é uma fera complicada.
No código-fonte do gdb a partir de hoje, as informações interessantes sobre o uso do ptrace do gdb são encontradas em target.h e inf-ptrace.c e pode facilmente ser perseguido de lá pelo ambicioso. Você verá que o gdb está usando ptrace , geralmente sem muita ambigüidade. Consulte os componentes da estrutura target_ops e encontre-os em inf-ptrace.c .
Do homem ptrace
>PTRACE_ATTACH
> Attach to the process specified in pid, making it a tracee of the calling process. The
> tracee is sent a SIGSTOP, but will not necessarily have stopped by the completion of
> this call; use waitpid(2) to wait for the tracee to stop. See the "Attaching and
> detaching" subsection for additional information. (addr and data are ignored.)
Então ptrace é usado, mas como ele sabe onde está tudo? Como o GDB obtém as informações necessárias para definir pontos de interrupção e ler dados? Sem DWARF ou algum formato de depuração menor, o gdb realmente não tem a menor ideia do que está fazendo ou de onde encontrar nada. Você ainda pode encontrá-los com o gdb pesquisando manualmente, porque as informações ainda estão lá na imagem do programa, mas o gdb não tem a menor idéia.
Abaixo está o Manual do Usuário do GDB - Stallman . O GDB, como acontece com todos os depuradores, usa um formato de depuração, normalmente DWARF em um sistema operacional razoável, para informações de símbolos referentes às funções e variáveis do programa.
In order to debug a program effectively, you need to generate
debugging information when you compile it. This debugging information
is stored in the object file; it describes the data type of each
variable or function and the correspondence between source line
numbers and addresses in the executable code.
.... You will have the best debugging experience if you use the latest
version of the DWARF debugging format that your compiler supports.
Informações sobre GDB, DWARF e PTRACE são extremamente fáceis de encontrar. E se você gosta de símbolos, informações sobre arquivos ELF também são fáceis de encontrar.