首页 > 其他分享 >【gdb】只允许一个线程运行

【gdb】只允许一个线程运行

时间:2023-10-15 20:56:08浏览次数:51  
标签:func Thread demo gdb 线程 thread1 允许

只允许一个线程运行

1. 例子:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int a = 0;
int b = 0;

void *thread1_func(void *p_arg)
{
  while (1)
  {
    a++;
    sleep(1);
  }
}

void *thread2_func(void *p_arg)
{
  while (1)
  {
    b++;
    sleep(1);
  }
}

int main(void)
{
  pthread_t t1, t2;

  pthread_create(&t1, NULL, thread1_func, "Thread 1");
  pthread_create(&t2, NULL, thread2_func, "Thread 2");

  sleep(1000);
  return 0;
}

用gdb调试多线程程序时,一旦程序断住,所有的线程都处于暂停状态。此时当你调试其中一个线程时(比如执行“step”,“next”命令),所有的线程都会同时执行。以上面程序为例:

(gdb) b demo.c:9
Breakpoint 1 at 0x400580: file demo.c, line 9.
(gdb) r
Starting program: /data2/home/nanxiao/demo.c
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff782c700 (LWP 17368)]
[Switching to Thread 0x7ffff782c700 (LWP 17368)]

Breakpoint 1, thread1_func (p_arg=0x400718) at demo.c:9
9                       a++;
(gdb) p b
$1 = 0
(gdb) s
10                      sleep(1);
(gdb) s
[New Thread 0x7ffff6e2b700 (LWP 17369)]
11              }
(gdb)

Breakpoint 1, thread1_func (p_arg=0x400718) at demo.c:9
9                       a++;
(gdb)
10                      sleep(1);
(gdb) p b
$2 = 3

thread1_func更新全局变量a的值,thread2_func更新全局变量b的值。我在thread1_funca++语句打上断点,当断点第一次命中时,打印b的值是0,在单步调试thread1_func几次后,b的值变成3,证明在单步调试thread1_func时,thread2_func也在执行。
如果想在调试一个线程时,让其它线程暂停执行,可以使用“set scheduler-locking on”命令:

(gdb) b demo.c:9
Breakpoint 1 at 0x400580: file demo.c, line 9.
(gdb) r
Starting program: /data2/home/nanxiao/demo.c
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff782c700 (LWP 19783)]
[Switching to Thread 0x7ffff782c700 (LWP 19783)]

Breakpoint 1, thread1_func (p_arg=0x400718) at demo.c:9
9                       a++;
(gdb) set scheduler-locking on
(gdb) p b
$1 = 0
(gdb) s
10                      sleep(1);
(gdb)
11              }
(gdb)

Breakpoint 1, thread1_func (p_arg=0x400718) at demo.c:9
9                       a++;
(gdb)
10                      sleep(1);
(gdb)
11              }
(gdb) p b
$2 = 0

可以看到在单步调试thread1_func几次后,b的值仍然为0,证明在在单步调试thread1_func时,thread2_func没有执行。此外,“set scheduler-locking”命令除了支持offon模式外(默认是off),还有一个step模式。含义是:当用"step"命令调试线程时,其它线程不会执行,但是用其它命令(比如"next")调试线程时,其它线程也许会执行。

这个命令依赖于具体操作系统的调度策略,使用时需注意。

 

参考资料

1. gdb手册

2. 只允许一个线程运行

标签:func,Thread,demo,gdb,线程,thread1,允许
From: https://www.cnblogs.com/sunbines/p/17766168.html

相关文章

  • 【gdb】调试子进程
    调试子进程1.例子#include<stdio.h>#include<sys/types.h>#include<unistd.h>intmain(void){pid_tpid;pid=fork();if(pid<0){exit(1);}elseif(pid>0){exit(0);}printf("helloworld\n&qu......
  • 【gdb】调试已经运行的进程
     调试已经运行的进程1.例子:#include<stdio.h>#include<pthread.h>void*thread_func(void*p_arg){while(1){printf("%s\n",(char*)p_arg);sleep(10);}}intmain(void){pthread_tt1,t2;pthread_create(&t1,NULL,......
  • java线程
    Java虚拟机(JVM,是运行所有Java程序的抽象计算机,是Java语言的运行环境)允许应用程序并发地运行多个线程。在Java语言中,多线程的实现一般有以下三种方法:1、实现Runnable接口,并实现该接口的run()方法。①自定义类并实现Runnable接口,实现run()方法。②创建Thread对象,用实现Ru......
  • 【gdb】让catchpoint只触发一次
    让catchpoint只触发一次1.例子:#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>intmain(void){pid_tpid;inti=0;for(i=0;i<2;i++){ pid=fork(); if(pid<0)......
  • 【gdb】打印内存的值
    打印内存的值1.例子#include<stdio.h>intmain(void){inti=0;chara[100];for(i=0;i<sizeof(a);i++){a[i]=i;}return0;}gdb中使用“x”命令来打印内存的值,格式为“x/nfuaddr”......
  • 线程之间的通信&线程池&设计模式
    day19_线程之间的通信&线程池&设计模式课程目标1.【理解】线程通信概念2.【理解】等待唤醒机制3.【理解】线程池运行原理4.【理解】voliate关键字5.【掌握】单例设计模式线程之间通信什么是线程之间的通信**概念:**多个线程在处理同一个资源,但是处理的动作(线程的任......
  • 【gdb】进入和退出图形化调试界面
    进入和退出图形化调试界面1.例子#include<stdio.h>voidfun1(void){inti=0;i++;i=i*2;printf("%d\n",i);}voidfun2(void){intj=0;fun1();j++;j=j*2;print......
  • 【gdb】打印数组的索引下标
    打印数组的索引下标1.例子#include<stdio.h>intnum[10]={1<<0,1<<1,1<<2,1<<3,1<<4,1<<5,1<<6,1<<7,1<<8,1<<9};intmain(void){inti;for......
  • 【gdb】gdb目录索引
    gdb目录索引 打印1打印ASCII和宽字符字符串打印数组中任意连续元素......
  • 【gdb】打印ASCII和宽字符字符串
    打印ASCII和宽字符字符串1.例子:#include<stdio.h>#include<wchar.h>intmain(void){charstr1[]="abcd";wchar_tstr2[]=L"abcd";return0;}用gdb调试程序时,可以使用“x/s”命令打印ASCII字符串。以上面程序为例:[root@node0......