栈跟踪显示执行在程序流中停止的位置及执行到达此点的过程。它提供了非常简明的程序状态描述。
对于使用 -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) |