2012-01-08 3 views
3

Je cours une application (firefox) et je voudrais savoir si il est possible d'utiliser GDB pour attacher au processus et tuer un thread spécifique. Y a-t-il un moyen de faire cela? Je comprends que cette opération va probablement planter l'application.Est-ce que GDB peut tuer un thread spécifique?

EDIT:

Dans cette session de débogage, ps -ax a révélé que Firefox est pid 1328:

$ gdb /Applications/Firefox.app/Contents/MacOS/firefox 1328 
GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Thu Nov 3 21:59:02 UTC 2011) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries ....... done 

/Users/karlphillip/1328: No such file or directory 
Attaching to program: `/Applications/Firefox.app/Contents/MacOS/firefox', process 1328. 
Reading symbols for shared libraries + done 
Reading symbols for shared libraries ++++++......................................................................................................................................................................................................... done 
0x00007fff90b9a67a in mach_msg_trap() 
(gdb) info threads 
    25         0x00007fff90b9bbca in __psynch_cvwait() 
    24         0x00007fff90b9bbca in __psynch_cvwait() 
    23         0x00007fff90b9bbca in __psynch_cvwait() 
    22         0x00007fff90b9a67a in mach_msg_trap() 
    21         0x00007fff90b9bbca in __psynch_cvwait() 
    20         0x00007fff90b9bbca in __psynch_cvwait() 
    19         0x00007fff90b9bbca in __psynch_cvwait() 
    18         0x00007fff90b9bbca in __psynch_cvwait() 
    17         0x00007fff90b9bbca in __psynch_cvwait() 
    16         0x00007fff90b9bbca in __psynch_cvwait() 
    15         0x00007fff90b9bbca in __psynch_cvwait() 
    14         0x00007fff90b9bbca in __psynch_cvwait() 
    13         0x00007fff90b9bbca in __psynch_cvwait() 
    12         0x00007fff90b9bbca in __psynch_cvwait() 
    11         0x00007fff90b9bbca in __psynch_cvwait() 
    10         0x00007fff90b9bbca in __psynch_cvwait() 
    9         0x00007fff90b9bbca in __psynch_cvwait() 
    8         0x00007fff90b9bbca in __psynch_cvwait() 
    7         0x00007fff90b9bdf2 in select$DARWIN_EXTSN() 
    6         0x00007fff90b9bbca in __psynch_cvwait() 
    5         0x00007fff90b9bbca in __psynch_cvwait() 
    4         0x00007fff90b9c7e6 in kevent() 
    3         0x00007fff90b9a67a in mach_msg_trap() 
    2 "com.apple.libdispatch-manager" 0x00007fff90b9c7e6 in kevent() 
* 1 "com.apple.main-thread"   0x00007fff90b9a67a in mach_msg_trap() 
(gdb) call raise(6, NOHUP) 
No symbol table is loaded. Use the "file" command. 
(gdb) 

Répondre

2

Vous pouvez certainement envoyer un fil spécifique d'un signal avec GDB call raise(kernel-thread-id, signo) ou call pthread_kill(pthread-thread-id, signo).

EDIT:

Pas de table de symbole est chargé. Utilisez la commande "fichier".

Je pense que vous avez fait quelque chose comme ceci:

gdb 
... 
(gdb) attach <pid> 

Sur certaines plates-formes GDB peut comprendre exécutable qui exécute dans un processus donné (par exemple à partir /proc/<pid>/exe sous Linux). Je devine que MacOS n'est pas l'une de ces plates-formes, et donc doit dire à GDB. Pour ce faire, à la place:

gdb /path/to/exe <pid> 
+0

Sur ** gdb 6.3.50-20050815 (version d'Apple gdb-1708) ** 'information threads' ne montre pas l'identifiant pthread, ni la bibliothèque pthread est chargé, donc' pthread_kill' ne peut pas être appelé. Essayer d'appeler 'raise' renvoie' Aucune table de symboles n'est chargée. Utilisez la commande "file". – karlphillip

+0

@karlphillip Il semble que vous fassiez * quelque chose * de mal. Mettez à jour votre question avec des détails sur la façon dont vous vous attachez au processus, et à quoi ressemble votre session GDB. * Alors * nous pouvons être en mesure de deviner * ce que vous faites mal. –

+0

Merci, mis à jour la question. – karlphillip

Questions connexes