views:

46

answers:

2

I have a program written in assembly that crashes with a segmentation fault. (The code is irrelevant, but is here.)

My question is how to debug an assembly language program with GDB?

When I try running it in GDB and perform a backtrace, I get no meaningful information. (Just hex offsets.)

How can I debug the program?

(I'm using NASM on Ubuntu, by the way if that somehow helps.)

+2  A: 

I would just load it directly into gdb and step through it instruction by instruction, monitoring all registers and memory contents as you go.

I'm sure I'm not telling you anything you don't know there but the program seems simple enough to warrant this sort of approach. I would leave fancy debugging tricks like backtracking (and even breakpoints) for more complex code.

As to the specific problem (code paraphrased below):

        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

You appear to be just pushing 5 on to the stack followed by the address of that 5 in memory (v_0). I'm pretty certain you're going to need to push the address of the format string at some point if you want to call printf. It's not going to take to kindly to being given a rogue format string.

It's likely that your:

mov eax, v_0

should be:

mov eax, format

and I'm assuming that there's more code after that call to printf that you just left off as unimportant (otherwise you'll be going off to never-never land when it returns).

paxdiablo
Exactly the problem - I just discovered that! Thank you!
George Edison
A: 

You should still be able to assemble with Stabs markers when linking code (with gcc).

I reccomend using YASM and assembling with -dstabs options:

$ yasm -felf64 -mamd64 -dstabs file.asm

This is how I assemble my assembly programs.

NASM and YASM code is interchangable for the most part (YASM has some extensions that aren't available in NASM, but every NASM code is well assembled with YASM).

I use gcc to link my assembled object files together or while compiling with C or C++ code. When using gcc, I use -gstabs+ to compile it with debug markers.

polemon