Comment puis-je trouver de l'erreur de segmentation à partir de plusieurs fichiers à l'aide de GDB
J'ai été demandé dans une interview comment pouvez-vous débogage faute de segmentation dans un programme C utilisant GDB.
Je leur ai dit que nous pouvons compiler notre programme avec -g
option ajouter des informations de débogage dans un fichier binaire et permet de lire les fichier de vidage de mémoire, mais ensuite interviewer m'a dit que si il nous disposons de 3 à 4 fichiers compilés ensemble, mais l'un d'eux, provoquant faute de segmentation alors comment pouvons-nous debug dans GDB?
Sauf si je suis vraiment malentendu ce que vous demandez, si vous souhaitez toujours compiler avec -g et de débogage exactement de la même façon.
J'ai aussi donné la même solution, mais ils ne les impressionne pas du tout ,ce qu'ils en argumentant comme il ne nous dit pas le nom exact du fichier provoquant l'erreur de segmentation
En fait, de toutes les questions de l'entrevue que j'ai vu ici, ce est en fait assez raisonnable. A de sens pour vérifier si un développeur qui sait comment utiliser quel que soit le débogueur est disponible sur la plate-forme correspondante.
J'ai aussi donné la même solution, mais ils ne les impressionne pas du tout ,ce qu'ils en argumentant comme il ne nous dit pas le nom exact du fichier provoquant l'erreur de segmentation
En fait, de toutes les questions de l'entrevue que j'ai vu ici, ce est en fait assez raisonnable. A de sens pour vérifier si un développeur qui sait comment utiliser quel que soit le débogueur est disponible sur la plate-forme correspondante.
OriginalL'auteur Amit Singh Tomar | 2012-01-23
Vous devez vous connecter pour publier un commentaire.
GDB va exécuter le programme en tant normal, lorsque l'erreur de segmentation se produit GDB va revenir à son invite et il sera presque le même que l'exécution de GDB avec un fichier core. La différence majeure est qu'il y a certaines choses que vous ne pouvez pas faire/imprimer avec un fichier de base que vous pouvez lorsque le programme s'est écrasé à l'intérieur de GDB. (Vous pouvez utiliser
print
à l'appel de certaines fonctions à l'intérieur du programme, par exemple.)Vous pouvez également joindre à un programme déjà en marche à l'aide de
gdb --pid <the programs pid>
.Soit avec un fichier de base ou avec l'une des méthodes ci-dessus, lorsque vous avez la GDB invite après le crash, type
backtrace
(oubt
pour faire court) et GDB va vous montrer la pile au moment de l'accident, y compris les noms de fichiers et les numéros de ligne de chaque appel et en cours d'exécution de la ligne.manuel explique... -ggdb peut produire de l'information supplémentaire pour GDB que g ne l'est pas. Si vous allez utiliser GDB, vous devraient utiliser -ggdb.
merci de caisse à savon 🙂
OriginalL'auteur SoapBox
Si vous travaillez sous Linux, la façon la plus facile de trouver faute de segmentation est par l'utilisation de l'outil nommé VALGRIND: http://valgrind.org/ .
Vous avez juste besoin de compiler votre code avec -g drapeau, puis sur exécuter ./valgrind .
Alors vous saurez exactement dans lequel la fonction et dans la ligne de code il y a une erreur de mémoire non initialisée/lecture de la mémoire de l'espace alloué ou qqch.
OriginalL'auteur Wookie88
Vous suffit d'exécuter le programme sous gdb, et le débogueur avec des captures de la SIGSEGV et de vous montrer la ligne et l'instruction qui en défaut. Alors que vous venez d'examiner les variables et/ou les valeurs de registre pour voir quel est le problème. Habituellement, c'est un voyou valeur du pointeur, et tente d'y accéder avec GDB va donner et d'erreur, il est donc facile.
Et oui, la recompilation de tout avec -g serait utile. L'interviewer a probablement voulu vous décrire comment vous pouvez déterminer quel fichier a la faute (gdb vous dit quand il capte le signal) et il suffit de recompiler avec les informations de débogage. Si il y a de 20 000 fichiers source qui pourrait être utile, mais avec 3 ou 4 fichiers, ce qui est le point? Même avec de plus grands projets, vous finissent généralement à chasser les mauvais pointeur à travers 10 fonctions et 5 fichiers de toute façon, encore une fois, quel est le point? Les informations de débogage ne coûte rien au moment de l'exécution, bien qu'il coûte de l'espace disque dans une installation.
OriginalL'auteur ams
compiler le code en mode normal en donnant gcc nom de fichier
vous recevrez un
.out
fichier, commencer à courir et obtenir l'id de processus en donnantps -aef | grep filename.out
dans un autre type de fenêtre
gdb
et de l'entrée,à l'intérieur de gdb invite de donnerattach processid
(processid vous obtiendrez de commande ci-dessus),donnerc
pour continuer.une fois l'exécution finis "bt" à l'intérieur de gdb.vous obtiendrez le lieu où la segmentation est en cours.OriginalL'auteur Ramanaidu
Sons comme ils sont à la recherche pour le configurer de sorte que vous pouvez parcourir le code comme il est en cours d'exécution, vous pouvez le faire avec la version en ligne de commande ou je pense que vous pouvez obtenir une interface graphique pour GDB.
OriginalL'auteur ColWhi
on peut utiliser les étapes suivantes pour déboguer erreur de segmentation à l'aide de gdb
OriginalL'auteur user3282672