u011412619的专栏

总结和区别(我的理解):

1、默认当某个线程遇到break后所有的其他线程也会停止,该线程continue后所有其他线程也会一起执行,如果不想让其他线程一起执行

那么可以使用线程锁模式(该模式指管continue的时候其他线程是否会同步一起执行),该模式的开启必须在已经停在某个断点后开可以。

2、默认当某个线程遇到break后所有的其他线程也会停止,加入不想让其他没有遇到断点的线程停止,那么需要开启non-stop模式。

3、线程锁是控制是否一起执行,开启后只有一个会执行;non-stop是控制遇到break后其他没有遇到断点的线程是否停止。两者是有区别的。

4、这两个是不是一般调试只能用一个呢,还是可以一起用我还不太清楚。。。。。。

下面是摘抄网上的,有些改动自己加上了。

1.线程锁

set scheduler-locking on/off 打开关闭7.0以前的gdb默认当程序继续运行的时候如果有断点,那么就把所有的线程都停下来,直到你指定某个线程继续执行(thread thread_no apply continue).但是如果直接在当前线程执行continue的话,默认是会启动所有线程。所以如果有多个线程都是断在同一个断点(函数)上,就是说这个函数是多线程的,那么调试的时候就会出现异常情况。所以需要打开线程锁。只让当前的线程执行,这意味着其他所有线程都不能执行了!

设置要求:需要在设置完断点并且gdb已经停在断点位置后设置,否则出现Target ‘None’ cannot support this command.//把gdb固定在当前线程

set scheduler-locking on

2. non-stop模式set target-async 1set pagination offset non-stop on

同1不一样,gdb启动了不停模式,其实就是说,除了断点有关的线程会被停下来,其他线程会执行执行。在网络程序调试的时候比较有用!

说白了就是,,一个线程break在一个断点后,其他的线程如果没有断点是会继续运行的。

需要注意着个设置需要在run之前就设置好,否则不行。3.所以可以根据gdb的版本及你的实际代码情况选择到底是线程锁还是non-stop模式4. 屏蔽SIGPIPEgdb中的套接字等关闭了,往里面写就会报错!handle SIGPIPE nostop noprint ignore

最后附上一段代码可以供大家测试使用,我自己的测试就懒得再写上,关键是尝试才会有理解!!!!

#include "stdio.h"#include "stdlib.h"#include "unistd.h"#include "fcntl.h"#include "sys/types.h" #include <pthread.h> int a(void){sleep(2);return 0; }int b(){a();return 0; }int c(){b();return 0; } void *myThread1(void) {int i=9;while(i>0){printf("Our 1st pthread,created by chn89.\n");sleep(2);i–;c();}pthread_exit(0); }void *myThread2(void) {int i=5;while(i>0){printf("Our 2st pthread,created by chn89.\n");sleep(2);i–;}pthread_exit(0); }int main() {int ret=0;pthread_t thread_id1,thread_id2;ret = pthread_create(&thread_id1, NULL, (void*)myThread1, NULL); //这里笔误,应为thread_id1 就是调试这里的错误if (ret){printf("Create pthread error!\n");return 1;}ret = pthread_create(&thread_id2, NULL, (void*)myThread2, NULL);if (ret){printf("Create pthread error!\n");return 1;}pthread_join(thread_id1, NULL);pthread_join(thread_id2, NULL);return 0; }

编译时使用命令 gcc -g test.c -o test -lpthread

积极的人在每一次忧患中都看到一个机会,

u011412619的专栏

相关文章:

你感兴趣的文章:

标签云: