Debugging a Program With dbx

Tracing at the Machine-Instruction Level

Tracing techniques at the machine instruction level work the same as at the source code level, except you use tracei. For tracei, dbx executes a single instruction only after each check of the address being executed or the value of the variable being traced. tracei produces automatic stepi-like behavior: the program advances one instruction at a time, stepping into function calls.

When you use tracei, it causes the program to stop momentarily after each instruction while dbx checks for the address execution or the value of the variable or expression being traced. Using tracei can slow execution considerably.

For more information on trace and its event specifications and modifiers, see Chapter 5, Setting Breakpoints and Traces."

Here is the general syntax for tracei:


tracei event-specification [modifier]

Commonly used forms of tracei are:

tracei step

Trace each instruction 

tracei next

Trace each instruction, but skip over calls 

tracei at address

Trace the given code address 

For SPARC:


(dbx) tracei next -in main 
(dbx) cont
0x00010814: main+0x0004:  clr     %l0
0x00010818: main+0x0008:  st      %l0, [%fp - 0x8]
0x0001081c: main+0x000c:  call    foo
0x00010820: main+0x0010:  nop     
0x00010824: main+0x0014:  clr     %l0
....
....
(dbx) (dbx) tracei step -in foo -if glob == 0
(dbx) cont              
0x000107dc: foo+0x0004:  mov     0x2, %l1
0x000107e0: foo+0x0008:  sethi   %hi(0x20800), %l0
0x000107e4: foo+0x000c:  or      %l0, 0x1f4, %l0     ! glob
0x000107e8: foo+0x0010:  st      %l1, [%l0]
0x000107ec: foo+0x0014:  ba      foo+0x1c
....
....