• gdb 调试多线程


    基本i threads 等操作略过,只谈线程同步、异步控制:

    先点到,gdb attach到主线程t1 时,所有线程都会停止,所谓同步异步效果,是指在apply continue到所有线程之后,

    再切换到t2,发现t3还在运行(如果t3卡在了断点上,也算运行,只不过运行后停止了)。

    再点到,gdb 直接attach 到非主线程时,是不影响,其他线程的启停的。无论如何设置non-stop或者schedule选项。

    以下,重点说下non-stop和schedule选项:

    1 non-stop

    只能在~/.gdbinit里设置,不能在gdb运行时设置,设置内容为:

    set target-async 1
    set pagination off
    set non-stop on

    attach到主线程t1后,切换t3,

    设置t3和t2内部的断点,执行c,t3运行后卡在断点,但是t2是不运行的,此时应t apply t2 t3(为了回到中断,只写t2会无法输入gdb操作) c,才能通知t2运行。

    如果t2无断点,那么一次t apply t2 t3后,他就是一直执行的了!

    2 scheduler-locking选项

    可以在主线程或者子线程设置均可。

    在使用step或者continue命令调试当前被调试线程的时候,

    off 不锁定任何线程,也就是所有线程都执行;如果

    on 只有当前被调试程序会执行;

    step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

           可以理解为step锁,非step不锁。

    t2和t3设置断点后,设置sche为off(俩t都执行)或者on(只看到一个thr执行),直接c,就能看到t2和t3的同步或异步效果;

    这时,如果t app 2 3 c,执行,效果和c一样,即使t2、t3只有一个断点,也会同时停下来的(non-stop在非断点的t不会停,除非新设b断干预之)。

    注意:set non-stop on和scheduler-locking同时设置效果未定义,测试,设置non-stop后再设置sche=on貌似无效!

    参考:

        coolshell的 gdb系列

       gdb技巧集 http://www.kancloud.cn/wizardforcel/gdb-tips-100/146771

  • 相关阅读:
    sort详解
    php之opcodes
    [转载] PHP升级导致系统负载过高问题分析
    Openresty实现获取内部location
    LUA语法汇总
    Openresty常用指令和参数
    PHP中的垃圾回收机制
    MySQL字段类型VARCHAR
    笔试题多线程
    笔试代码考查
  • 原文地址:https://www.cnblogs.com/zhaoyl/p/5970347.html
Copyright © 2020-2023  润新知