How do I analyze a program's core dump file with GDB when it has command-line parameters?
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
anddown
(navigate in the stack frame (call chain))
How to analyse a coredump file of GDB
GDB can get you started:
$ gdb --help
This is the GNU debugger. Usage:
gdb [options] [executable-file [core-file or process-id]]
gdb [options] --args executable-file [inferior-arguments ...]
[snip extended docs]
So, you'll invoke it like this:
gdb myprog core
GDB will then start in the usual way, but the state will be as if you'd stopped at a breakpoint. You can then use "print", "examine", "list", "backtrace", "up", "down", etc. to investigate what caused the crash.
In fact, you can use any GDB command except "continue", "step", "next", or anything else that requires an actual running program.
gdb debugging of core.# file - getting the full command which caused the crash
You can load core dump with matching binary (the one for which core dump was generated) and print argv
values in the frame where main
function resides.
Something like this:
gdb /tools/graphmap/bin/Linux-x64/graphmap /4thExp/core.82912
Then go up in stack trace to initial frame where int main(int argc, char *argv[])
resides. Now you can print the number of arguments and their values from gdb prompt.
Update:
It appears that your binary is multithreaded and crash happened in some auxiliary thread. You should therefore find main
thread and switch to it. Here is an example of how to do it for Firefox with many threads:
(gdb) t a a bt -1
Thread 59 (Thread 0x7f691deff700 (LWP 25924)):
#12 0x00007f69dce93f6f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:105
..........
..........
many threads are listed here
..........
..........
Thread 1 (Thread 0x7f69de01a740 (LWP 4143)):
#17 0x000056374cb38817 in main ()
(gdb) t 1
[Switching to thread 1 (Thread 0x7f69de01a740 (LWP 4143))]
#0 0x00007f69dce8800d in poll () at ../sysdeps/unix/syscall-template.S:84
84 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
Now gdb is switched to main
thread (Thread 1).
Related Topics
Mount Smb/Cifs Share Within a Docker Container
How to Prompt For Yes/No/Cancel Input in a Linux Shell Script
Bash Script Prints "Command Not Found" on Empty Lines
Exploring Docker Container'S File System
How to Print the Ld(Linker) Search Path
How to Run a Shell Script When a File or Directory Changes
How to Get Cmake to Find My Alternative Boost Installation
How to Access the System Call from User-Space
How to Redirect Output of an Already Running Process
Linux Bash: Multiple Variable Assignment
Format and Then Convert Txt to CSV Using Shell Script and Awk
How to Compare Two Strings in Dot Separated Version Format in Bash
Using Openssl to Get the Certificate from a Server
What Does $@ Mean in a Shell Script
Ld Cannot Find an Existing Library
Error When Using Git Credential Helper With Gnome-Keyring as Sudo
How to Deal With a Filename That Starts With the Hyphen (-) Character