Files
GDB-tutorial/GDB-Commands-Scripts-Workflow.adoc
2025-11-14 07:20:58 +05:30

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.