Oracle® Solaris Studio 12.4:使用 dbx 调试程序

退出打印视图

更新时间: 2015 年 1 月
 
 

显示和读取堆栈跟踪

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

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

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

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

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

在以下示例中,程序因段故障而崩溃。 原因很可能是 SPARC 输入寄存器 $i0 中的 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)

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