【发布时间】:2016-12-22 01:21:22
【问题描述】:
我有以下代码 (source):
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid) {
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld\n", tid);
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
pthread_t threads[NUM_THREADS];
int rc;
long t;
for (t=0; t<NUM_THREADS; t++) {
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
// wait for all threads to die
pthread_exit(NULL);
}
我用gcc -g main.c -o main -lpthread 编译。我正在使用 GDB 进行调试。我想要的是在 PrintHello 的第二行放置一个断点,即在tid = (long)threadid,并让执行停止在那里(无论线程),让我做一些事情,比如查看变量 threadid 的值。
我想在 Emacs 的 GDB 实现中实现这一点——出于这个问题的目的,我们可以假设它只是 GDB(不要担心它在 Emacs 中运行)。到目前为止,我可以将断点放在所需的行,有时显示程序所在行的小箭头确实会停在这一行:
但是,当我在 GDB 提示符 print threadid 中输入时,我会返回 No symbol "threadid" in current context.,并且箭头会立即跳转到我在 main() 中设置的某个断点:
我的猜测是,这是因为程序执行的“暂停”发生在主线程上,而不是运行PrintHello 的线程。 PrintHello 由线程 t 运行 - 因为这不是 GDB 暂停的线程,所以它打印 hello world 消息并立即存在。当我开始输入 print threadid 时,这个线程已经死了,程序又回到了 main()... 因此效果。
我试图通过输入break <LineNumber> thread <ThreadID> 之类的内容来解决这个问题,但这并不好,因为在这个程序中,创建的线程会持续一瞬间。所以我实际上从来没有处于info thread 显示除主线程之外的任何内容的地步。在主线程和新创建的线程运行 PrintHello 的点上“捕获”程序是人类不可能的——因为我猜这种情况会持续几微秒。
请帮助我实现这个简单的调试目标,即在tid = (long)threadid; 行停止执行正在执行的任何线程PrintHello。
【问题讨论】: