Sun Studio 12:使用 dbx 调试程序

显示和读取栈跟踪

栈跟踪显示执行在程序流中停止的位置及执行到达此点的过程。它提供了非常简明的程序状态描述。

显示栈跟踪,请使用 where 命令。

对于使用 -g 选项编译的函数,由于参数的名称和类型已知,因此显示的是准确值。对于无调试信息的函数,显示的参数值是十六进制数。这些数字未必都有意义。通过函数指针 0 进行函数调用时,函数值显示为一个小的十六进制数,而非符号名。

可以在未使用 -g 选项编译的函数中停止。在此类函数中停止时,dbx 将在栈中向下搜索其函数是使用 -g 选项编译的第一个帧,并设置其当前作用域(请参见程序作用域)。这用箭头符号 (=>) 表示。

在以下示例中,main() 是使用 -g 选项编译的,因此会显示符号名以及参数值。main() 调用的库函数不是使用 -g 编译的,因此会显示函数的符号名,但对于参数而言,只会显示 SPARC 输入寄存器 $i0$i5 的十六进制内容。


(dbx) where
  [1] _libc_poll(0xffbef3b0, 0x1, 0xffffffff, 0x0, 0x10, 0xffbef604), at 0xfef9437c
  [2] _select(0xffbef3b8, 0xffbef580, 0xffbef500, 0xffbef584, 0xffbef504, 0x4), at 0xfef4e3dc
  [3] _XtWaitForSomething(0x5a418, 0x0, 0x0, 0xf4240, 0x0, 0x1), at 0xff0bdb6c
  [4] XtAppNextEvent(0x5a418, 0x2, 0x2, 0x0, 0xffbef708, 0x1), at 0xff0bd5ec
  [5] XtAppMainLoop(0x5a418, 0x0, 0x1, 0x5532d, 0x3, 0x1), at 0xff0bd424
=>[6] main(argc = 1, argv = 0xffbef83c), line 48 in "main.cc"
:

在本示例中,程序因段故障而崩溃。同时只有 main() 是使用 -g 选项编译的,因此库函数的参数显示为不带符号名的十六进制内容。造成崩溃的原因很可能是 SPARC 输入寄存器 $i0$i1 中的 strlen() 的参数为空。


(dbx) run
Running: Cdlib
(process id 6723)

CD Library Statistics:

 Titles:         1

 Total time:     0:00:00
 Average time:   0:00:00

signal SEGV (no mapping at the fault address) in strlen at 0xff2b6c5c
0xff2b6c5c: strlen+0x0080:    ld      [%o1], %o2
Current function is main
(dbx) where
  [1] strlen(0x0, 0x0, 0x11795, 0x7efefeff, 0x81010100, 0xff339323), at 0xff2b6c5c
  [2] _doprnt(0x11799, 0x0, 0x0, 0x0, 0x0, 0xff00), at 0xff2fec18
  [3] printf(0x11784, 0xff336264, 0xff336274, 0xff339b94, 0xff331f98, 0xff00), at 0xff300780
=>[4] main(argc = 1, argv = 0xffbef894), line 133 in "Cdlib.c"
(dbx)

有关更多栈跟踪示例,请参见查看调用栈跟踪调用