Disclaimer : All the postings on this site are my own and don’t necessarily represent IBM’s positions, strategies or opinions.
This post is part of the “Learn debugging using AIX DBX” series. It provides tips for customizing the DBX debugging environment using .dbxinit file. If you looking for some other aspect of debugging with AIX DBX go to the parent topic or other sub-topics here : https://www.sangeek.com/day2dayunix/2013/08/learn-debugging-using-aix-dbx/
.dbxinit file gives an opportunity for the debuggers to provide initial set of commands that should be executed at the beginning of the dbx session. Using this we can provide “Useful customization for the dbx debugging environment”.
For the .dbxinit file to be automatically picked up by the dbx command. it has to be placed in the $HOME directory of the user or the user’s current directory from where DBX is being executed.
Here’s the list of subcommands that I find very useful :
Here’s why each is for :
1. “set $repeat” saves you the pain of typing the same commands again and again. It re-executes the last command on pressing the enter key.
 stopped in main at line 18
18 int val = 0, a, b, c, d;
stopped in main at line 20
20 a = 12;
(dbx) <———————————————————- Pressing “enter” key execute the “next” subcommand
stopped in main at line 21
21 b = 5;
(dbx)<———————————————————- Pressing “enter” key execute the “next” subcommand
stopped in main at line 22
22 c = 3;
2. “set $deferevents” turns on the defer events feature allowing the user to set breakpoints in functions which are not yet loaded
e.g. I want to stop in function process_output(), which is defined/declared in a separate library which is not yet loaded by the binary being debugged :
(dbx) st in process_output
“process_output” is not loaded. Creating deferred event: <————- creates a deferred breakpoint
<3> stop in process_output
Processing deferred event# 3 <————- Identifies a library load and checks if the symbol of deferred event is loaded
 stopped in new_lib.process_output [/usr/lib/libtest.a] at line 234 <————- Stops at the deferred breakpoint
234 int a = 20;
This subcommand helps the user by allowing us to set breakpoints in functions of libraries which are not yet loaded. User does not have to wait till the library is loaded for setting a breakpoint.
3. “set $expandunions” allows the user print and see values of all the individual members of a union. By default, dbx allows us to print the values of each union member separately.
e.g. In your program you have a union defined like this :
Without “set $expandunions” subcommand, you would have to print each member of the union :
(dbx) print un1
(dbx) print un1.ival
(dbx) print un1.fval
With “set $expandunions” enabled, you can just do this :
(dbx) print un1
union:(ival = 1, fval = 1.40129846e-45) <————- prints all the members of union in one shot
4. By default dbx skips the breakpoints e.g. the ones set in “called functions” while the user is stepping through the program using “next”.
With “set $catchbp” set we can ensure that we don’t miss on those breakpoints.
C program (7)
call graph (1)
Device Drivers (6)
Flash Caching (1)
Kernel Extension (4)
Subscribe to Blog via Email
Google Analytics Statsgenerated by GADWP
- “call graph” generation using Doxygen and Graphviz August 20, 2017
- CMVC user guide for transitioning to Git June 25, 2017
- pretty print symbols in AIX with kdb, KDBSYM, pr August 13, 2016
- Configure SAS controller/disk for use in AIX/VIOS partition May 15, 2016
- Enhanced num_cmd_elems attribute for virtual FC ( NPIV ) AIX March 19, 2016