GNU/Linux >> Linux Esercitazione >  >> Linux

Posso utilizzare GDB per eseguire il debug di un processo in esecuzione?

Puoi collegarti a un processo in esecuzione con gdb -p PID .


Sì. Usa il attach comando. Dai un'occhiata a questo link per ulteriori informazioni. Digitando help attach su una console GDB dà quanto segue:

(gdb) help attach

Allega a un processo o file al di fuori di GDB.Questo comando si collega a un altro target, dello stesso tipo dell'ultimo"target " comando ("info files " mostrerà il tuo stack di destinazione). Il comando può prendere come argomento un id di processo, un nome di processo (con un id di processo facoltativo come suffisso) o un file di dispositivo. Per un id di processo, devi avere il permesso di inviare il elaborare un segnale e deve avere lo stesso uid effettivo del debugger. Quando si utilizza "attach " a un processo esistente, il debugger trova il programma in esecuzione nel processo, cercando prima nella directory di lavoro corrente o (se non lo trova) utilizzando il percorso di ricerca del file di origine (vedere il "directory "). Puoi anche usare il comando "file " comando per specificare il programma e per caricare la sua tabella dei simboli.

NOTA:potresti avere difficoltà a collegarti a un processo a causa della maggiore sicurezza nel kernel di Linux, ad esempio collegandoti al figlio di una shell da un'altra.

Probabilmente dovrai impostare /proc/sys/kernel/yama/ptrace_scope a seconda delle vostre esigenze. Molti sistemi ora hanno come impostazione predefinita 1 o superiore.

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.

Sì. Puoi fare:

gdb program_name program_pid

Una scorciatoia potrebbe essere (supponendo che sia in esecuzione solo un'istanza):

gdb program_name `pidof program_name`

Linux
  1. Garantire che un processo sia sempre in esecuzione?

  2. Verificare il processo se lo stesso è in esecuzione?

  3. L'ID thread di un processo multithread può essere uguale all'ID processo di un altro processo in esecuzione?

  4. Possiamo usare il codice C in Python?

  5. Come posso conoscere il percorso assoluto di un processo in esecuzione?

Come elencare i processi in esecuzione in Linux

Come eseguire il debug di programmi C in Linux usando gdb

Come utilizzare GDB per eseguire il debug di programmi in Ubuntu 20.04

Processi in esecuzione

Posso fidarmi ciecamente di 127.0.0.1?

Posso usare APT su TinyCore?