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

退出打印视图

更新时间: 2015 年 1 月
 
 

恢复执行

可以使用 cont 命令来恢复程序执行。 因为线程目前使用同步断点,所以所有线程都会恢复执行。不过,您可以使用带有 –resumeone 选项的 call 命令恢复单个线程。

    在调试多线程应用程序(其中许多线程会调用函数 lookup())时,请考虑以下两种情况:

  • 您设置条件断点:

    stop in lookup -if strcmp(name, "troublesome") == 0

    t@1 在对 lookup() 的调用处停止时,dbx 尝试对条件求值并调用 strcmp()

  • 您设置断点:

    stop in lookup

    t@1 在对 lookup() 的调用处停止时,发出以下命令:

    call strcmp(name, "troublesome")

调用 strcmp() 时,dbx 将会恢复调用期间内的所有线程,这与使用 next 命令进行单步执行时 dbx 所执行的操作类似。之所以这样做的原因是,如果 strcmp() 尝试抓取另一个线程拥有的锁,则仅恢复 t@1 可能会导致死锁。

在这种情况下恢复所有线程的缺点是,dbx 无法处理另一个线程(例如 t@2),从而会在调用 strcmp() 时在 lookup() 处遇到断点。它会发出类似以下之一的警告:

event infinite loop causes missed events in following handlers:

Event reentrancy first event BPT(VID 6, TID 6, PC echo+0x8) second event BPT(VID 10, TID 10, PC echo+0x8) the following handlers will miss events:

在这些情况下,如果可以确定条件表达式中调用的函数不会抓取互斥锁,则可使用 -resumeone 事件修饰符强制 dbx 只恢复 t@1

stop in lookup -resumeone -if strcmp(name, "troublesome") == 0

只恢复在 lookup() 中遇到断点的线程,以便对 strcmp() 进行求值。

    此方法在诸如以下示例中会无能为力:

  • 由于条件以递归方式调用 lookup()lookup() 上的第二个断点发生在同一个线程中

  • 运行条件的线程放弃控制权、休眠或以某种方式将控制权交给另一个线程