调试不匹配的核心转储文件时应注意:
pathmap 命令不能识别 "/" 路径映射,因此不能使用以下命令:
pathmap / /net/core-host
pathmap 命令的单参数模式不能与装入对象路径名同时使用,因此请使用双参数(来源路径和目标路径)模式。
如果 dbx 主机使用的 Solaris 操作环境版本与核心主机相同或比它更新,那么调试核心转储文件时效果可能会更好,虽然这并不总是必要。
可能需要的系统库是:
对于运行时链接程序:
/usr/lib/ld.so.1
/usr/lib/librtld_db.so.1
/usr/lib/64/ld.so.1
/usr/lib/64/librtld_db.so.1
对于线程库,取决于您所使用的 libthread 执行:
/usr/lib/libthread_db.so.1
/usr/lib/64/libthread_db.so.1
如果 dbx 在支持 64 位的 Solaris OS 版本上运行,您将需要 64 位版本的 xxx_db.so 库,因为这些系统库是作为 dbx 的一部分(而不是目标程序的一部分)装入和使用的。
与 libc.so 或任何其他库一样,ld.so.1 库是核心转储文件映像的一部分,因此需要与创建核心转储文件的程序相匹配的 32 位 ld.so.1 库或 64 位 ld.so.1 库。
如果正在查看来自某个线程程序的核心转储文件,并且 where 命令未显示栈,请尝试使用 lwp 命令。例如:
(dbx) where current thread: t@0 [1] 0x0(), at 0xffffffff (dbx) lwps o>l@1 signal SIGSEGV in _sigfillset() (dbx) lwp l@1 (dbx) where =>[1] _sigfillset(), line 2 in "lo.c" [2] _liblwp_init(0xff36291c, 0xff2f9740, ... [3] _init(0x0, 0xff3e2658, 0x1, ... ... |
如果 LWP 的帧指针 (fp) 被破坏,则 lwp 命令的 -setfp 和 -resetfp 选项会很有用。这些选项在调试核心转储文件时使用,此时 assign $fp=... 不可用。
缺少线程栈表明 thread_db.so.1 有问题,因此,您可能还需要尝试从核心主机中复制适当的 libthread_db.so.1 库。