Kdb 命令

kdb 命令可以用于分析不同状态下的系统和系统文件。

kdb 命令可用于分析以下内容:

  • 正在运行的系统。

    当用于分析正在运行的系统时, kdb 命令会打开 /dev/pmem 特殊文件,该文件允许直接访问系统的物理内存并绕过处理器的正常地址转换机制。 kdb 命令使用与 KDB 内核调试器相同的算法在内部执行自己的地址转换。 这使用户能够按有效地址查看数据。

    注: 只有 root 用户才能使用 kdb 命令来分析正在运行的系统。
  • 由先前崩溃的系统生成的系统转储文件。

    当系统崩溃时,将在开启内存转换的情况下创建系统转储映像。 因此,在转储时未映射至有效地址空间的任何物理内存都不能包含在转储文件中。 只有属于在创建转储映像的处理器上运行的进程的内存才能包含在转储文件中。 由于系统转储中的所有地址都是有效地址,因此 kdb 命令不会执行其内部地址转换。

    系统转储包含某些关键数据结构。 系统转储不包含完整的有效地址空间。 kdb 命令可能无法查看某些内存区域。 如果有人尝试访问未包含在转储中的内存地址,那么 kdb 命令将显示一条警告消息。

    在分析系统转储时,"kdb命令必须使用与转储时运行的UNIX文件相同的版本。 要检查转储和 UNIX 文件的时间戳记,请使用以下命令:

    $ what unix | grep _kdb_buildinfo
             _kdb_buildinfo unix_64 Mar 14 2005 10:24:29 (This is the return that users will get.) 
    $ what dump | grep _kdb_buildinfo
             _kdb_buildinfo unix_64 Mar 14 2005 10:24:29

    两个文件的时间戳记必须完全相同。 还可以通过运行以下命令来检查 kdb 命令的时间戳记:

    $ what /usr/sbin/kdb_64 | grep _kdb_buildinfo
             _kdb_buildinfo unix_64 Mar  4 2005 14:45:20
    $ what /usr/sbin/kdb_mp | grep _kdb_buildinfo
             _kdb_buildinfo unix_mp Mar  4 2005 14:31:53

    此时间戳记通常将早于转储和 UNIX 文件的时间戳记。 通常, kdb 命令可以在此情况下读取转储。 但是,如果 kdb 命令与 UNIX 文件之间的版本差异过大,那么 kdb 可能无法读取转储。 在这种情况下,请使用与所使用的 UNIX 版本更接近的 kdb 版本。

    注: cdt 子命令或 -v 命令行选项可用于确定有效地址空间的哪些区域包含在系统映像中。 有关 CDT 子命令的更多信息,请参阅 cdt 子命令。 有关 -v 命令行选项的更多信息,请参阅 kdb 命令

kdb 命令包含在 KDB 内核调试器中找到的子命令的子集。 用于设置断点和单步执行代码的子命令在 kdb 命令中不可用。 由于 kdb 命令是作为普通用户空间程序实现的,因此它无法控制系统中的处理器。 同样,任何直接访问硬件的子命令 (例如, PCI 子命令) 都不可用。 当您使用系统转储时,任何修改内存的子命令都是无效的,因为系统转储只是系统中实内存的快照。

可用于 KDB 内核调试器和 kdb 命令的子命令的完整列表包含在 子命令列表中。