Search code examples
linuxdebugginggdbcoredump

How do I analyze a program's core dump file with GDB when it has command-line parameters?


My program operates like this:

exe -p param1 -i param2 -o param3

It crashed and generated a core dump file, core.pid.

I want to analyze the core dump file by

gdb ./exe -p param1 -i param2 -o param3 core.pid

But GDB recognizes the parameters of the EXE file as GDB's input.

How do I analyze a core dump file in this situation?


Solution

  • You can use the core with GDB in many ways, but passing parameters which is to be passed to the executable to GDB is not the way to use the core file. This could also be the reason you got that error. You can use the core file in the following ways:

    gdb <executable> <core-file> or gdb <executable> -c <core-file> or

    gdb <executable>
    ...
    (gdb) core <core-file>
    

    When using the core file you don't have to pass arguments. The crash scenario is shown in GDB (checked with GDB version 7.1 on Ubuntu).

    For example:

    $ ./crash -p param1 -o param2
    Segmentation fault (core dumped)
    $ gdb ./crash core
    GNU gdb (GDB) 7.1-ubuntu
    ...
    Core was generated by `./crash -p param1 -o param2'. <<<<< See this line shows crash scenario
    Program terminated with signal 11, Segmentation fault.
    #0  __strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
    99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
        in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
    (gdb)
    

    If you want to pass parameters to the executable to be debugged in GDB, use --args.

    For example:

    $ gdb --args ./crash -p param1 -o param2
    GNU gdb (GDB) 7.1-ubuntu
    ...
    (gdb) r
    Starting program: /home/@@@@/crash -p param1 -o param2
    
    Program received signal SIGSEGV, Segmentation fault.
    __strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
    99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
        in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
    (gdb)
    

    Man pages will be helpful to see other GDB options.

    Most useful commands are:

    • bt (backtrace)
    • info locals (show values of local variables)
    • info registers (show values of CPU registers)
    • frame X (change to stack frame X)
    • up and down (navigate in the stack frame (call chain))