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

退出打印视图

更新时间: 2015 年 1 月
 
 

过滤器和多线程

如果在多线程程序中设置的断点中使用了包含多个函数调用的过滤器,dbx 将在到达断点时停止所有线程的执行,然后对条件求值。 如果满足条件且调用了函数, dbx 便会恢复执行调用期间内的所有线程。

例如,可以在多线程应用程序中许多线程调用 lookup() 之处设置以下断点:

(dbx) stop in lookup -if strcmp(name, “troublesome”) == 0

dbx 会在线程 t@1 调用 lookup() 时停止,并对条件求值,然后调用恢复所有线程的 strcmp()。如果在函数调用期间 dbx 在另一个线程中遇到断点,便会发出警告,例如:

event infinite loop causes missed events in the following handlers:
...
Event reentrancy
first event BPT(VID 6m TID 6, PC echo+0x8)
second event BPT*VID 10, TID 10, PC echo+0x8)
the following handlers will miss events:
...

在这种情况下,如果可以确定条件表达式中调用的函数不会抓取互斥锁,则可使用 -resumeone 事件规范修饰符强制 dbx 只恢复在其中遇到断点的第一个线程。 例如,可设置以下断点:

(dbx) stop in lookup -resumeone -if strcmp(name, “troublesome”) == 0

    在有些情况下,-resumeone 修饰符并不能防止出现问题。例如,它在以下情况下不起作用:

  • 由于条件以递归方式调用 lookup(),所以 lookup() 上的第二个断点与第一个断点出现在同一个线程中。

  • 运行条件的线程放弃控制权,将其交给另一个线程。

有关详细信息,请参见事件规范修饰符