多线程调试_gdb 多线程调试 - CSDN
精华内容
参与话题
  • 在日常开发中我们经常会遇到多线程Debug调试, 一般我们都是利用Spring Boot对外提供接口,Tomcat中在有多人同时访问时,会开启多线程,但是,这时有可能发生异常。 说明接口在多线程访问中不是很稳定,这时就要...

    在日常开发中我们经常会遇到多线程Debug调试,

    一般我们都是利用Spring Boot对外提供接口,Tomcat中在有多人同时访问时,会开启多线程,但是,这时有可能发生异常。

    说明接口在多线程访问中不是很稳定,这时就要利用多线程的Debug调试。

    以下是一个小Demo来演示多线程的Debug调试

    public class LockDemoReetrantLock {
        private int i=0;
        private ReentrantLock reentrantLock=new ReentrantLock();
        public void inCreate(){
         断点   reentrantLock.lock();
    
            try{
                i++;
            }finally {
                reentrantLock.unlock();//注意:一般的释放锁的操作都放到finally中,
                // 多线程可能会出错而停止运行,如果不释放锁其他线程都不会拿到该锁
            }
    
        }
    
    
        public static void main(String[] args){
            ReentrantLock lock = new ReentrantLock();
            lock.lock();
            LockDemoReetrantLock lockDemoReetrantLock = new LockDemoReetrantLock();
            for (int i=0;i<3;i++){
                new Thread(()->{
                    lockDemoReetrantLock.inCreate();
                }).start();
            }
    
    
        }
    }
    

    开始刚一执行此时i=2

    接着下一步下一步,程序直接跳出 看不到ReentrantLock的排队操作,

     

    再次运行

    在进行一次调试此时i=1

    同样看不到排队操作,不是我们想要的结果!!

    在断点调试的断点上右击实现设置(Mac版)

    一运行Debug 其它两个线程就已经启动了,中有一个线程能够停止到这个断点

    改为Thread之后---->makeDefault---->done

    此时就Ok了

    F8

    接下来我们看第二个线程是否获得锁

    点入该线程(012线程顺序是随机的)

    F8显示未挂起的线程不可用 该线程没能获取到该锁(同理Thread2也不能获取该锁)

    线程1和2 wait 线程0和主线程running

    线程1和2都在等待资源

    接下来看ReetrantLock 的执行过程

    重新启动

    此时3个线程都停留在这

    此时跳入inCreat方法

    再条进到lock方法中去  进入到非公平锁的实现

    F8首先执行CAS

    其他线程就不会执行

     

     此时由于是线程0先执行的,我们再开一下线程1(012执行顺序是随机的这里假定0先执行)

    接下来看线程1

     

     之后执行acquire方法

    再跳

    跳进去

    此时addWaiter执行完毕

    接着执行acquireQueued方法

     

    同理线程2也这样

    执行tryRelease方法

     

    tryRelease方法执行成功

    执行完成之后就会唤醒其他线程

    该线程执行完毕

    接着查看其他线程(1,2)

     

    展开全文
  • VS2010下多线程调试(来自MSDN)

    千次阅读 2018-08-15 10:07:52
    使用“线程”窗口 “线程”窗口包含每行表示应用程序中一个线程的表。 默认情况下,该表列出应用程序中的所有线程,但您可以筛选列表以仅显示您感... 箭头的轮廓指示执行在调试器中分解的线程。 “ID”列,包含每...

    使用“线程”窗口

    “线程”窗口包含每行表示应用程序中一个线程的表。 默认情况下,该表列出应用程序中的所有线程,但您可以筛选列表以仅显示您感兴趣的线程。 每列都包含不同类型的信息。 您还可以隐藏某些列。 如果显示所有列,将从左到右显示以下信息:

    标志列,您可以在此处标记要格外关注的线程。

    活动线程列,此处黄色箭头指示一个活动线程。 箭头的轮廓指示执行在调试器中分解的线程。

    “ID”列,包含每个线程的标识号。

    “托管 ID”列,包含托管线程的托管标识号。

    “类别”列,将线程划分为用户界面线程、远程过程调用处理程序或辅助线程。 一个特殊类别标识应用程序的主线程。

    “名称”列,如果有线程,则按名称标识每个线程,否则标识为“<无名称>”。

    “位置”列,显示线程运行的位置。 可以展开此位置以显示线程的完整调用堆栈。

    “优先级别”列,包含系统已向每个线程分配的优先级。

    “关联掩码”列,高级列,通常隐藏。 此列显示每个线程的处理器关联掩码。 在多处理器系统中,关联掩码确定线程可以在哪些处理器上运行。

    “已挂起”列,包含挂起项计数。 此计数确定线程是否可以运行。

    “进程名称”列,包含每个线程所属的进程。 在调试多个进程时,此列会很有用,但此列通常隐藏。

    切换活动线程

    任意执行以下步骤之一:

               双击任一线程。

               右击一个线程,再单击“切换到线程”。

               黄色箭头会出现在新活动线程的旁边。 箭头的灰色轮廓标识执行在调试器中分解的线程

    显示线程调用堆栈

    在多线程程序中,每个线程都有自己的调用堆栈。 “线程”窗口提供了一种查看这些堆栈的简便方法。

    查看线程的调用堆栈,在“位置”列中,单击线程位置旁边的倒三角形。 此位置将展开以显示线程的调用堆栈。 

     

     

    扩充阅读:

    使用Visual Studio 2010调试并行程序

           Visual Studio 2010对并行程序的调试提供了强大的手段,给程序设计好断点以后,可以使用Threads窗口查看当前程序的所有线程:

     

           在图 19‑9中双击某行,可以让指定的线程成为当前“激活”的“被调试”的线程。

                  另外,Parallel Tasks窗口展示了当前程序所运行的所有任务:

    在Parallel Stacks窗口中,则可以直观地看到每个线程的调用堆栈:

     

    有关Visual Studio 2010调试器的使用方法,请查询MSDN。本书不再赘述。

     

     

    另外,

     

        扩充阅读:

    使用Visual Studio 2010调试并行程序

           Visual Studio 2010对并行程序的调试提供了强大的手段,给程序设计好断点以后,可以使用Threads窗口查看当前程序的所有线程:

     

           在图 19‑9中双击某行,可以让指定的线程成为当前“激活”的“被调试”的线程。

                  另外,Parallel Tasks窗口展示了当前程序所运行的所有任务:

    在Parallel Stacks窗口中,则可以直观地看到每个线程的调用堆栈:

     

    有关Visual Studio 2010调试器的使用方法,请查询MSDN

    展开全文
  • GDB多线程调试

    千次阅读 2017-03-02 23:00:28
    多线程调试基本命令: info threads:显示当前可调试的所有线程,GDB会给每一个线程都分配一个ID。前面有*的线程是当前正在调试的线程。thread ID:切换当前调试的线程为指定ID的线程。thread apply all command:让...

    多线程调试基本命令:
    info threads:显示当前可调试的所有线程,GDB会给每一个线程都分配一个ID。前面有*的线程是当前正在调试的线程。

    thread ID:切换当前调试的线程为指定ID的线程。

    thread apply all command:让所有被调试的线程都执行command命令。

    thread apply ID1 ID2 … command:让线程编号是ID1,ID2…等等的线程都执行command命令。

    set scheduler-locking off|on|step:在使用step或continue命令调试当前被调试线程的时候,其他线程也是同时执行的,如果我们只想要被调试的线程执行,而其他线程停止等待,那就要锁定要调试的线程,只让他运行。
    off:不锁定任何线程,所有线程都执行。
    on:只有当前被调试的线程会执行。
    step:阻止其他线程在当前线程单步调试的时候抢占当前线程。只有当next、continue、util以及finish的时候,其他线程才会获得重新运行的

    show scheduler-locking:查看当前锁定线程的模式。

    //示例:
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<pthread.h>
    
    void* fun1(void *arg)
    {
        int i;
        for(i=0;i<10;i++)
        {
            printf("fun1 %d\n",i);
            sleep(1);
        }
        printf("this is thread1:%lu\n",pthread_self());
        pthread_exit(NULL);
        return NULL;
    }
    
    void* fun2(void *arg)
    {
        int i;
        for( i=0;i<10;i++)
        {
            printf("fun2 %d\n",i);
            sleep(1);
        }
        printf("this is thread2:%lu\n",pthread_self());
        pthread_exit(NULL);
        return 0;
    }
    
    int main()
    {
        printf("this is main:%lu\n",pthread_self());
        pthread_t tid1,tid2;
        pthread_create(&tid1,NULL,fun1,NULL);
        pthread_create(&tid2,NULL,fun2,NULL);
        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);
        return 0;
    }
    

    1、锁定线程及查看锁定的模式
    这里写图片描述

    2、查看当前所有被调试的线程
    这里写图片描述
    有*的线程表示当前正在调试的线程。

    3、让所有线程都打印堆栈信息
    这里写图片描述

    4、从线程1切换到线程2
    这里写图片描述
    可以看到,*从1的前面到2的前面了,这就表示切换到了线程2。

    展开全文
  • 线程的查看以及利用gdb调试多线程

    万次阅读 多人点赞 2018-05-20 16:01:05
    1. 线程的查看 首先创建两个线程: #include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt; #include &amp;amp;amp;lt;unistd.h&amp;amp;amp;gt; #include &amp;amp;amp;lt;pthread.h&amp;amp...

    更多linux知识点:linux目录索引


    1. 线程的查看

    首先创建两个线程:

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <stdlib.h>
    #include <string.h>
    
    void* pthread_run1(void* arg)
    {
        (void)arg;
    
        while(1)
        {
            printf("I am thread1,ID: %d\n",pthread_self());
            sleep(1);
        }
    }
    
    void* pthread_run2(void* arg)
    {
        (void)arg;
    
        while(1)
        {
            printf("I am thread2,ID: %d\n",pthread_self());
            sleep(1);
        }
    }
    
    
    int main()
    {
    
        pthread_t tid1;
        pthread_t tid2;
    
        pthread_create(&tid1,NULL,pthread_run1,NULL);
        pthread_create(&tid2,NULL,pthread_run2,NULL);
    
        printf("I am main thread\n");
    
        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);
        return 0;
    }
    

    分析:上面程序中创建了两个线程,程序执行起来,main函数所在程序为主线程,在这个主线程中有两个新线程运行

    命令行查看:

    //查看当前运行的进程
    ps aux|grep a.out
    //查看当前运行的轻量级进程
    ps -aL|grep a.out
    //查看主线程和新线程的关系
    pstree -p 主线程id

    这里写图片描述

    2. 线程栈结构的查看

    1. 获取线程ID
    2. 通过命令查看栈结构 ps stack 线程ID

    这里写图片描述

    3. 利用gdb查看线程信息

    1. 将进程附加到gdb调试器当中,查看是否创建了新线程:gdb attach 主线程ID

      这里写图片描述

    2. 查看线程的一些信息

    //1.查看进程:info inferiors
    //2.查看线程:info threads
    //3.查看线程栈结构:bt
    //4.切换线程:thread n(n代表第几个线程)

    这里写图片描述

    4. 利用gdb调试多线程

      当程序没有启动,线程还没有执行,此时利用gdb调试多线程和调试普通程序一样,通过设置断点,运行,查看信息等等,在这里不在演示,最后会加上调试线程的命令

    1. 设置断点

      //1. 设置断点:break 行号/函数名
      //2. 查看断点:info b

      这里写图片描述

    2. 执行线程2的函数,指行完毕继续运行到断点处

      1. 继续使某一线程运行:thread apply 1-n(第几个线程) n
      2. 重新启动程序运行到断点处:r

      这里写图片描述

    3. 只运行当前线程

      1. 设置:set scheduler-locking on
      2. 运行:n

      这里写图片描述

    4. 所有线程并发执行

          1. 设置:set scheduler-locking off
          2. 运行:n

      这里写图片描述

    总结调试多线程的命令

    命令 用法
    info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程
    thread ID(1,2,3…) 切换当前调试的线程为指定ID的线程
    break thread_test.c:123 thread all(例:在相应函数的位置设置断点break pthread_run1) 在所有线程中相应的行上设置断点
    thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command
    thread apply all command 让所有被调试线程执行GDB命令command
    set scheduler-locking 选项 command 设置线程是以什么方式来执行命令
    set scheduler-locking off 不锁定任何线程,也就是所有线程都执行,这是默认值
    set scheduler-locking on 只有当前被调试程序会执行
    set scheduler-locking on step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行
    展开全文
  • 一种语言的开发环境往往会附带有语言库,这些库就是对操作系统的API的包装,我们也称这些语言库为运行库 对于MSVC的运行库(CRT),...在调试模式下,使用调试运行库:多线程调试(/MTd)、多线程调试DLL(/MDd) ...
  • 多线程调试

    2020-07-02 18:05:56
    1 多线程调试开发过多线程应用的朋友应该有体会,有些时候,为了观察多个线程间变量的不同状态,以及锁的获取等,就会想到在代码里加个断点debug一下。在IDE里断点停下来的时候,可以切换到另外的
  • 如下所示,我将断点打在//断点1 这个位置,但是调试的时候run方法进不去,但是程序始终处于运行状态,请教大家,怎样进行多线程程序的调试? import java.util.concurrent.ExecutorService; import java.util....
  • gdb调试多进程与多线程

    万次阅读 多人点赞 2017-06-10 16:52:09
    一,gdb的基础知识1>介绍: gdb是Linux环境下的代码调试工具。 2>使用:需要在源代码生成的时候加上 -g 选项. 3>开始使用: gdb binFile 4>退出:ctrl + d 或 quit 5>调试过程中的常用命令: list/l 行号:显示...
  • 如何进行多线程调试

    2013-06-19 22:04:07
    最近需要调试多线程程序,就试着在网上搜了些资料。正好整理了一个例子方便自己理解和记忆 static void* WorkThread1(void *threadId) { int64 tid = (int64)threadId; int i = 0; while(i ) { i++; sleep...
  • VS多线程下如何调试单线程

    千次阅读 2018-11-07 23:46:32
    首先打开VS菜单栏-调试-窗口-线程 不想调试线程直接冻结掉 如果只想调试一个线程就必须冻结掉其他线程,这样才不会有干扰,调试的时候不会乱跳喜欢的话点个赞
  • Idea Intellij多线程调试

    万次阅读 多人点赞 2016-03-18 17:16:11
    (适用Idea 14 & 15,...在多线程调试的时候,一些断点会被跳过。比如像下面的代码:public static void main(String[] args) throws InterruptedException { new Thread() { // 断点0 @Override public void run()
  • Eclipse调试多线程代码

    万次阅读 多人点赞 2013-02-16 14:07:09
    默认情况下,在调试多线程程序时,当遇到断点时(breakpoint),当前线程暂停,而其它线程继续运行,有些情况下,这是我们不想要看到的。比如下面的例子: 除第21个线程以外,其余都是Running状态。 ...
  • gdb调试多线程

    万次阅读 2017-03-03 17:38:19
    首先先介绍多线程调试的基本命令:  1.info threads,显示当前可调试的所有线程。每个线程会有gdb为其分配的ID,后面的操作会用到这个ID。前面带'*'号的是当前正在调试的线程。  2.thread ID,切换当前调试的线程...
  • IntelliJ IDEA - Debug 调试多线程程序

    万次阅读 多人点赞 2018-01-11 23:29:18
    IntelliJ IDEA - Debug 调试多线程程序 新建 MyRunnable public class MyRunnable implements Runnable { @Override public void run() { Thread currentThread = Thread.currentThread(); Sy
  • 多线程程序使用了锁,当卡住时,可以如下调试: 点击“调试/全部中断” 然后在“线程”窗口会显示当前运行的各个线程,以及他们的堆栈信息。 这样就可以查看各个线程卡在哪里了。
  • GDB调试多线程程序

    千次阅读 2013-07-17 21:32:35
    显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试线程。 thread ID 切换当前调试线程为指定ID的线程 break thread_test.c:123 thread ...
  • OD调试多线程

    万次阅读 2013-06-08 21:15:21
    OD只能单线程调试,也就是每次只能跟一条线程。以前我调试时常常迷迷糊糊就进入新线程,而有时又怎么也进不了。。。 最近大概明白了一点点。 方法:首先是设置StrongOD,如下图: 不要勾选“Skip Some ...
  • 多线程的那点儿事(之多线程调试

    万次阅读 多人点赞 2011-12-06 21:39:46
    【 声明:版权所有,欢迎转载,请勿用于商业用途。...  软件调试是我们软件开发过程中的重要一课。...比如说条件断点,数据断点,多线程断点等等。 #include int value = 0; void test() { int total; i
  • GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的...
  • IDEA调试多线程

    千次阅读 2017-05-12 07:59:23
    使用idea调试多线程的时候发现多线程无法调试,后来经过搜索发现,idea的断点有不同的模式,只有当Thread模式下才能调试多线程,设置方式如下: 在断点上右键 选择Thread,然后点Done(建议选择Thread后点击make default把...
1 2 3 4 5 ... 20
收藏数 227,869
精华内容 91,147
关键字:

多线程调试