2010-09-09 12 views
1

J'ai un programme écrit en assembly qui se bloque avec un défaut de segmentation. (Le code est non pertinent, mais here.)Comment déboguer un programme assemblé?

Ma question est de savoir comment déboguer un programme en langage assembleur avec GDB? Lorsque j'essaie de l'exécuter dans GDB et d'effectuer un backtrace, je ne reçois aucune information significative. (Juste des décalages hexadécimaux.)

Comment puis-je déboguer le programme?

(j'utilise MSNA sur Ubuntu, par la voie si cela aide en quelque sorte.)

Répondre

2

Je voudrais simplement charger directement dans gdb et l'étape à travers elle instruction par instruction, suivi de tous les registres et le contenu de la mémoire que vous aller.

Je suis sûr que je ne vous dis rien que vous ne connaissez pas, mais le programme semble assez simple pour justifier ce genre d'approche. Je voudrais laisser des astuces de débogage fantaisie comme le retour en arrière (et même les points d'arrêt) pour un code plus complexe.

En ce qui concerne le problème spécifique (code paraphrasé ci-dessous):

 extern printf 

     SECTION .data 
format: db  "%d",0 

     SECTION .bss 
v_0: resb  4 

     SECTION .text 
     global main 
main: 
     push  5 
     pop  eax 
     mov  [v_0], eax 
     mov  eax, v_0 
     push  eax 
     call  printf 

Vous semblez pousser juste 5 sur la pile suivie par l'adresse de ce 5 dans la mémoire (v_0). Je suis assez certain que vous aurez besoin de pousser l'adresse de la chaîne de format à un certain moment si vous voulez appeler printf. Il ne va pas falloir bien vouloir donner une chaîne de format voyous.

Il est probable que votre:

mov eax, v_0 

devrait être:

mov eax, format 

et je en supposant qu'il n'y a plus de code après appel à printf que vous venez laissé sans importance (sinon tu partiras pour ne jamais atterrir quand il reviendra).

+0

Exactement le problème - je viens de découvrir ça! Je vous remercie! –

1

Vous devriez toujours pouvoir assembler avec des marqueurs Stabs lors de la liaison de code (avec gcc).

Je recommande l'utilisation YASM et l'assemblage avec des options -dstabs:

$ yasm -felf64 -mamd64 -dstabs file.asm 

Voici comment je rassemble mes programmes de montage.

Les codes NASM et YASM sont interchangeables pour la plupart (YASM a des extensions qui ne sont pas disponibles dans NASM, mais chaque code NASM est bien assemblé avec YASM).

J'utilise gcc pour relier mes fichiers objets assemblés ou lors de la compilation avec code C ou C++. Lorsque j'utilise gcc, j'utilise -gstabs+ pour le compiler avec des marqueurs de débogage.