mirror of
https://github.com/Hizenberg469/GDB-tutorial.git
synced 2026-04-19 22:02:23 +03:00
118 lines
3.0 KiB
Plaintext
118 lines
3.0 KiB
Plaintext
= *GDB Commands, Scripts and Workflow*
|
|
|
|
=== Breakpoints and Commands -- save time!
|
|
|
|
In order to display some specific information when we reach a breakpoint,
|
|
we can achieve this by `(gdb)command` command in gdb.
|
|
[source,]
|
|
----
|
|
(gdb) command 1
|
|
Type commands for breakpoint(s) 1, one per line.
|
|
End with a line saying just "end".
|
|
>print arr
|
|
>print size
|
|
>end
|
|
----
|
|
|
|
Here, the argument to "command" is the index of the breakpoint to which
|
|
these print commands will be associated to.
|
|
|
|
|
|
=== define your own commands
|
|
|
|
In order to define bunch of command give it a name like a alias
|
|
we can use `define <alias>`.
|
|
[source,]
|
|
----
|
|
(gdb) define log
|
|
Type commands for definition of "log".
|
|
End with a line saying just "end".
|
|
>info args
|
|
>info frame
|
|
>bt
|
|
>end
|
|
----
|
|
[source,]
|
|
----
|
|
Temporary breakpoint 1, main () at array.c:34
|
|
34 int main () {
|
|
(gdb) log
|
|
No arguments.
|
|
Stack level 0, frame at 0x7fffffffe230:
|
|
rip = 0x555555555217 in main (array.c:34); saved rip = 0x7ffff7c2a1ca
|
|
source language c.
|
|
Arglist at 0x7fffffffe220, args:
|
|
Locals at 0x7fffffffe220, Previous frame's sp is 0x7fffffffe230
|
|
Saved registers:
|
|
rbp at 0x7fffffffe220, rip at 0x7fffffffe228
|
|
#0 main () at array.c:34
|
|
----
|
|
|
|
To redefine the same alias like in the above example 'log' we can use
|
|
the same command `define log`
|
|
|
|
=== gdb scripts
|
|
|
|
It is like a .vimrc for gdb.
|
|
|
|
It is named as *.gdbinit* and it is defined in home (~/) directory
|
|
and, if we want, can be overridden by defining the *.gdbinit*
|
|
in the current directory.
|
|
|
|
In this script, we can `define` command to define aliases and
|
|
print some message, etc.
|
|
|
|
=== Shell commands within GDB (shell, make and pipe)
|
|
|
|
To run shell commands within GDB use keyword `shell` with respective
|
|
shell command like `ls` as an argument.
|
|
[source,]
|
|
----
|
|
$ gdb ./main --silent
|
|
Reading symbols from ./main...
|
|
(gdb) shell ls
|
|
add array assertion core.14804 gcore_example.c infinite.c leak.c main.c memory.c segfault.c
|
|
add.c array.c assertion.cpp gcore_example infinite leak main memory segfault
|
|
----
|
|
|
|
We can also use `make` command within GDB to compile the excutable
|
|
from gdb itself.
|
|
|
|
Now when you compile the executable within GDB using `make` command,
|
|
there are two senario which arises.
|
|
|
|
*Senario 1*
|
|
|
|
_When the name of the program remain same._
|
|
|
|
In this case, we can simply start the execution of program from
|
|
the beginning again.
|
|
|
|
Use `start` command to do so.
|
|
|
|
|
|
*Senario 2*
|
|
|
|
_When the name of the program changes_
|
|
|
|
In this cae, we can load the executable to the running gdb using `file`
|
|
command and start the executation again.
|
|
[source,]
|
|
----
|
|
(gdb)file ./<executable>
|
|
----
|
|
|
|
=== Edit source files within GDB
|
|
|
|
To edit current source in gdb without exiting out of the GDB session,
|
|
we can use `edit` command to open the source file in editor to run the
|
|
program. Make sure that the there is a environment variable `EDITOR=<editor-name>` defined and exported so that GDB can use it.
|
|
[source,]
|
|
----
|
|
(gdb)edit 5
|
|
----
|
|
|
|
Load the program again with successful compilation to see the changes made.
|
|
|
|
|