【问题标题】:Setting watchpoint for multithreaded applications with gdb使用 gdb 为多线程应用程序设置观察点
【发布时间】:2011-11-08 11:40:32
【问题描述】:

gdb 手册说如下。

警告:在多线程程序中,软件观察点的用处有限。如果 gdb 创建了软件观察点,它只能在单个线程中观察表达式的值。如果您确信表达式只能由于当前线程的活动而改变(并且如果您也确信没有其他线程可以成为当前线程),那么您可以像往常一样使用软件观察点。但是,gdb 可能不会注意到非当前线程的活动何时更改表达式。 (相比之下,硬件观察点在所有线程中观察一个表达式。)

那么,如何使用 gdb 将 watchpoint 与多个线程一起使用,以便 gdb 可以看到任何线程对监视变量的更改?

【问题讨论】:

    标签: c linux gdb x86


    【解决方案1】:

    一般来说,软件观察点的成本确实很高。如果您正在观看地址定义明确的标量数据,您可以使用硬件观察点,例如

      p &myvar
      $1 = (int*) 0x1234556
      watch *(int*) 0x1234556
    

    这仅适用于简单的标量数据(单指针、单整数、单字节...)

    【讨论】:

    • 那么我如何告诉 gdb 使用硬件观察点而不是软件观察点?
    • 由 gdb 选择如何实现观察点。硬件观察点只能在极少数标量(固定)地址上实现。
    • 确保您的 gdb 可以实际使用硬件观察点:(gdb) show can-use-hw-watchpoints
    • 但它适用于多线程应用程序吗?我的意思是gdb可以看到任何线程对变量的更改?
    • 我相信是的。硬件观察点由硬件寄存器管理,每个内核都应该有它们。
    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2011-01-12
    相关资源
    最近更新 更多