12
votes

Affichage de chaque instruction d'assemblage exécutée dans GDB

J'ai actuellement un bug délai qui se produit dans un endroit où je n'ai pas accès à la source ou aux symboles, c'est-à-dire que je peux voir l'instruction et son adresse où le crash se produit, mais c'est à ce sujet. Ce que je voudrais faire, c'est avoir gdb exécuter sans avoir besoin d'interaction et afficher toutes les instructions telles que cela le fait , mais je dois encore trouver un moyen de le faire.

Qu'est-ce que j'espère atteindre est quelque chose comme ceci: xxx

Ce que je fais est de mettre en place un affichage pour le comptoir de programme, comme: < / p> xxx

puis en cours d'exécution via le code avec stepp : xxx

Cependant, le crash est Des centaines ou des milliers d'instructions d'instructions, et je voudrais un moyen de voir chacun (ensemble, si préférable), sans avoir à frapper «Entrée» à plusieurs reprises. En outre, si je devais le faire manuellement, je verrais une invite d'invite (gdb) entre chaque instruction, qui est inférieure à souhaitable.

Un itinéraire J'ai brièvement regardé est script , Mais ma seule pensée est de configurer à principal () , a-t-il afficher et une autre pause (pour la prochaine instruction), puis continue, mais je ne peux pas utiliser les commandes Dans les commandes COMMANDES Bloc, de sorte que cela ne fonctionnerait pas comme je l'imagine.

au cas où il importe, je travaille sur FreeBSD.


0 commentaires

3 Réponses :


1
votes
  1. Désactivez le binaire séparément (par ex. à l'aide de Objdump) et consultez la liste lors du débogage
  2. Utilisez IDA et son débogueur. Beaucoup meilleure expérience imo.

    (Disclaimer: Je travaille pour les rayons hexagonales)


2 commentaires

J'ai mis à jour ma question à noter que je travaille actuellement sur FreeBSD, que je crois que règle # 2?


Ah oui, actuellement IDA ne prend pas en charge les binaires FreeBSD de débogage. Cependant, vous pouvez toujours l'utiliser comme désassembleur (sous Windows / Wine ou en utilisant Support Linux sur FreeBSD) - C'est bien mieux que de regarder la liste morte.



16
votes

Ce qui suit devrait faire ce que vous avez demandé: XXX

Cependant, cette approche du débogage sera probablement futile: il y a simplement trop nombreux instructions exécutées même dans Programmes les plus triviaux.

Une meilleure approche peut être d'exécuter le programme jusqu'à crash, tenter de comprendre quelle fonction actuelle fait et qui l'appelle et définit de manière appropriée.

sur x86 , vous pouvez souvent déduire souvent les limites de la fonction même dans l'exécutable entièrement dépouillé.

Une autre chose que vous souhaiterez regarder est Strace / TRUSS de sortie, vous permettant ainsi de voir quel système appelle immédiatement précéder le point de crash.


2 commentaires

Comment définir ce journal sur un autre fichier que gdb.txt? Puis-je définir le nom du fichier par timbre?


@ YFR24493azzRggagacom Oui, vous pouvez. S'il vous plaît poser cette question comme une vraie question, pas comme un commentaire.



5
votes

script python strong>

Cela donnera plus de flexibilité que le script de GDB pour atteindre vos idées folles. P>

Le principal problème ici, tout comme avec les scripts GDB, est-ce que ceci Sera probablement trop lent pour la plupart des applications sans support de matériel cible, par exemple: Un monde Hello World prend 1 minute pour seulement 18 km. p>

gdb.py p> xxx pré> p> GitHub Upstream . P>

main.s p> xxx pré>

GITUB UPSTREAM . P>

Assemblez et exécutez: P>

warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
----------------
IN: 
0x0000000000401000:  mov    $0x1,%rax
0x0000000000401007:  mov    $0x1,%rdi
0x000000000040100e:  mov    $0x402000,%rsi
0x0000000000401015:  mov    $0xc,%rdx
0x000000000040101c:  syscall 

hello world
----------------
IN: 
0x000000000040101e:  mov    $0x3c,%rax
0x0000000000401025:  mov    $0x0,%rdi
0x000000000040102c:  syscall


4 commentaires

Cela semble très intéressant et je me demandais si vous pouvez résoudre comment exécuter ce code. Existe-t-il un module de gdb spécial qui doit être importé?


@TTB Bonjour, vous venez de le chercher comme un script GDB régulier, voir la réponse mise à jour. La liaison est intégrée à GDB, pas besoin d'installer quelque chose de plus. Je me suis aussi amusé avec Qemu tout en examinant cela et ajouté pour répondre.


@ Ciro Santilli 疆 营 六四 事件 法轮功 营 营 郝 郝 郝 郝 郝 郝 郝 海东 Pourquoi votre GDB.py est-il meilleur que le script simple employait le russe mis? Merci


@ YFR24493azzRggagagacom Pas pour le cas d'utilisation exact, l'avantage est la plupart du temps la flexibilité qu'il fournit, par ex. Vous pouvez trivialement le pirater pour casser à une instruction donnée: Stackoverflow.com/Questtions/14031930/... ou éteindre les parties de l'impression en fonction de ce que vous voulez voir ( Une trace d'instructions complète sera trop lente pour tout sauf les programmes les plus triviaux)