Zxdb 控制台命令和互动模型

##

Zxdb 具有内置帮助系统:

[zxdb] help

如需获取有关特定命令或主题(在本例中为 step 命令)的帮助,请运行以下命令:

[zxdb] help step

互动模型

大多数命令行调试程序都使用专有模型进行输入:您要么与调试进程的 stdin 和 stdout 交互,要么与调试程序进行交互。相比之下,zxdb 有一个异步模型,类似于大多数 GUI 调试程序。在此模型中,当任意进程或线程正在运行或停止时,用户专门与调试程序进行交互。

当调试程序本身启动某个程序时,它会将程序的 stdout 和 stderr 输出到控制台。当您附加(使用过滤器或 attach 命令)时,这些附件会转到原始位置。目前,无法与进程的 stdin 进行交互。

Zxdb 有一个用于输入命令的常规名词/动词模型。本部分的其余内容概述了适用于所有命令的语法。下面的“任务指南”部分介绍了具体命令。

名词

可能的名词(及其缩写)包括:

  • processpr
  • threadt
  • framef
  • breakpointbp

列出名词

如果您单独输入名词,则会列出该类型的可用对象:

  • 列出附加进程

    [zxdb] process
      # State       Koid Name
    ▶ 1 Not running 3471 debug_agent_unit_tests.cm
    
  • 列出当前进程中的线程:

    [zxdb] thread
      # State   Koid Name
    ▶ 1 Blocked 1348 initial-thread
      2 Blocked 1356 some-other-thread
    
  • 列出当前线程中的堆栈帧(必须停止线程 - 请参阅下面的 pause):

    [zxdb] frame
    ▶ 0 fxl::CommandLineFromIterators<const char *const *>() • command_line.h:203
      1 fxl::CommandLineFromArgcArgv() • command_line.h:224
      2 main() • main.cc:174
    

选择默认设置

如果您键入一个名词及其索引,则会选择该名词作为后续命令的默认名称。同时还将提供有关新默认值的统计信息。

  • 选择线程 3 作为未来命令的默认线程:

    [zxdb] thread 3
    Thread 3 Blocked koid=9940 worker-thread
    
  • 选择断点 2 作为默认断点:

    [zxdb] breakpoint 2
    Breakpoint 2 (Software) on Global, Enabled, stop=All, @ MyFunction
    

动词

默认情况下,动词(runnextprint 等)适用于当前的默认值。因此,如需在当前堆栈帧的上下文中对表达式求值,只需单独输入 print 即可:

[zxdb] print argv[1]
"--foo=bar"

您可以在动词前面加上名词及其索引来覆盖默认上下文。因此,如需在特定堆栈帧(在本例中为当前线程的第 2 帧)的上下文中评估表达式,请使用以下代码:

[zxdb] frame 2 print argv[1]
"--foo=bar"

您可以不断添加不同类型的背景信息。此属性指定了输出命令的进程、线程和帧:

[zxdb] process 1 thread 1 frame 2 print argv[1]
"--foo=bar"

属性和设置

Debugger 对象具有关联的设置。使用“get”动词列出指定对象的设置:

[zxdb] breakpoint 1 get
  enabled  true
  location main
  one-shot false
  scope    global
  stop     all
  type     software

带有特定属性的“get”命令将列出该属性以及与其相关的帮助:

[zxdb] breakpoint 1 get scope

  ... help text here ...

scope = global

“set”命令用于设置以下值:

[zxdb] breakpoint 1 set scope="process 1 thread 2"
[zxdb] breakpoint 1 set enabled=false

部分设置是分层的。线程会从其进程继承设置,而进程又继承全局范围的设置。不带上下文或参数的“get”命令将列出全局设置以及当前进程和线程的全局设置。您可以设置全局设置以应用于所有线程和进程而不进行特定替换,或者替换特定上下文:

[zxdb] set show-stdout = false            # Applies to all processes with no override.
[zxdb] process 2 set show-stdout = true   # Overrides a specific process.

部分设置是列表。您可以使用 += 进行附加,也可以使用“=”指定新值。列表元素以空格分隔(带空格的引号字符串)。

[zxdb] set symbol-paths = /foo/bar/baz "/home/Dr. Strangelove/cache"
[zxdb] set symbol-paths += /tmp
[zxdb] get symbol-paths
  ... help text ...

symbol-paths =
  • /foo/bar/baz
  • "/home/Dr. Strangelove/cache"
  • /tmp