2017-08-24 1 views
0

Je veux utiliser eclipse IDE comme interface graphique frontale pour déboguer un fichier core d'un autre système d'exploitation qui est docker dans mon hôte. Avec 'gdbserver' dans le docker je ne peux déboguer qu'un processus en cours. Mais j'ai besoin d'un débogage post-mortem des fichiers de base.analyse de fichier core distant avec eclipse

J'ai essayé quelques-uns/home/moi/bin/wrapper remote_gdb qui utilise

docker exec -it $DOCKER_CONTAINER bash -c "gdb /usr/bin/executable /opt/crash/executable.core 

Cela fonctionne à l'aide dans une coquille. Mais il ne parvient à l'aide de « Eclipse » à cause de

Could not determine GDB version using command: remote_gdb --version 

même si « --version remote_gdb » imprime exactement le même que l'original « gdb --version ».

je pouvais faire fonctionner quelque chose avec 'ddd' comme front-end - laissez-moi l'exercice:

> cd $HOME/SRC 
> ls -l 
total 4 
-rw-rw-r-- 1 frank frank 96 Aug 24 18:04 test.c 

> cat test.c 
#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    printf("hello, world!\n"); 
    return 0; 
} 

> docker run -v $HOME/SRC:/SRC -t fedora /bin/bash 
// IN DOCKER NOW: 
>> yum install gcc 
[...] 
>> yum install gdb 
[...] 
>> cd /SRC 
>> gcc -g3 -O0 -o test test.c 
>> ls -l 
total 40 
-rwxr-xr-x 1 root root 34864 Aug 24 16:26 test 
-rw-rw-r-- 1 1000 1000 96 Aug 24 16:04 test.c 

Retour à l'hôte:

> docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
e501d8384060  fedora    "/bin/bash"   4 minutes ago  Up 4 minutes       stupefied_murdock 
> cat $HOME/bin/remote_gdb 
#!/bin/bash 
docker exec -it e501d8384060 gdb /SRC/test 

> remote_gdb # $HOME/bin/ is in $PATH 
GNU gdb (GDB) Fedora 8.0-20.fc26 
Copyright (C) 2017 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-redhat-linux-gnu". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from /SRC/test...done. 
(gdb) list 
1 #include <stdio.h> 
2 
3 int main(int argc, char** argv) 
4 { 
5  printf("hello, world!\n"); 
6  return 0; 
7 } 
8 
(gdb) 

Le retour à la shell, où je suis dans le docker - voir 'gdb' est en cours d'exécution:

>> yum install procps-ng 
[...] 
>> ps -ef 
UID  PID PPID C STIME TTY   TIME CMD 
root   1  0 0 16:22 ?  00:00:00 /bin/bash 
root  16  0 0 16:23 ?  00:00:00 bash 
root  116  0 0 16:28 ?  00:00:00 gdb /SRC/test 
root  131 16 0 16:30 ?  00:00:00 ps -ef 

Retour à nouveau sur la coque hôte (après session de quitter gdb docker):

> ddd --debugger remote_gdb 

Le 'nnn' joue bien avec gdb a commencé en docker. Et il fonctionne également avec les fichiers core (ajouter un "sleep (100);" et tuer le processus). Mais 'ddd' n'a pas une très bonne interface graphique. Alors, quel est le moyen de faire un tel travail avec 'éclipse'? Je ne pouvais pas faire aussi travailler avec d'autres options: 'QtCreator', 'KDevelop', 'nemiver', 'kdbg', etc

Addendum:

Il ne fonctionne pas avec ' ssh 'dans le conteneur. Mais quand j'exécute le même script wrapper 'remote_gdb' que 'External Tool', il peut être exécuté (?!)

Répondre

0

J'ai partiellement pu résoudre le problème.
Le problème principal était: ma commande docker ne fournit pas de tty à éclipse.
Pour contourner le problème, je suis passé à "ssh" dans l'image du docker.
En outre, j'ai dû aligner les emplacements de fichiers (exécutable, fichier core et fichiers sources) entre l'image de l'hôte et celle du docker. Parce que l'utilisation d'un script wrapper 'gdb', 'eclipse' ne sait pas que je débogue à distance et vérifie tous les fichiers pour la disponibilité locale.

Cela fonctionne pour le débogage post-mortem (analyse de fichiers core) et l'attachement d'un processus en cours d'exécution dans docker (en général sur le système distant).
Cependant, il ne fonctionne pas pas pour lancer un processus dans gdb via eclipse.

Donc utilisé 'strace' pour vérifier les activités entre 'eclipse' et 'gdb' et découvert que, pour lancer un nouveau processus dans 'gdb', 'eclipse' essaie d'appliquer '--interpreter mi2 commande « -nx:

set-TTY-inférieur --thread groupe i1/dev/pts/27

Est-ce que cela signifie qu'il essaie de lier un TTY local gdb?
Bien sûr, cela ne fonctionne pas à distance.

Quelle est la raison d'utiliser "inferior-tty-set" par "eclipse"?
Il n'utilise pas cette commande pour effectuer un débogage post-mortem ou attacher un processus en cours d'exécution - tandis que pour les deux j'ai même une console gdb utilisable en 'éclipse'

?