2011-02-25 42 views
0

我正在用gdb调试我的应用程序。 我用中断主 因此,它可以打破主调用。 知道如果我使用thread info它表明线程数为1GDB在非线程应用程序中显示1线程

如何线程之前主开始? 我的电话中没有任何线程调用,所以线程正在创建。我使用这些库

sqlite的,卷曲,PCRE,C-客户

更新 我已经写了一个示例程序来测试,如果所有的程序开始与单个线程

#include<iostream> 
int main(int argc,char *argv[]){ 
    std:: cout<<"Will I have any thread"; 
    return 0; 
} 

但我用gdb调试时

(gdb) break main 
Breakpoint 1 at 0x400783: file threadtest.cpp, line 3. 
(gdb) run 
Starting program: /home/vivek/Desktop/a.out 

Breakpoint 1, main (argc=1, argv=0x7fffffffe728) at threadtest.cpp:3 
3   std:: cout<<"Will I have any thread"; 
(gdb) info threads 
* 1 process 21608 main (argc=1, argv=0x7fffffffe728) at threadtest.cpp:3 
(gdb) 

它d没有显示相同的信息。它显示1个进程不是1个线程。

当我用-lpthread编译它时,它显示1个线程。

因此,当我们使用lpthread时程序从一个线程开始? 或GDB的行为如此?

+1

难道是这个线程是你的主线程吗? – p4553d 2011-02-25 09:59:00

回答

2

所有程序都至少有1个线程,即主线程。该程序在main之前启动,因为C++运行时在main()启动之前会进行一些初始化,如调用所有具有构造函数的全局对象。

+0

当我使用-lpthread链接示例程序gdb show 1 thread时。但是,当它不显示一个过程。因此,当我们使用lpthread时,程序从一个线程开始? 或GDB的行为如此? – 2011-02-25 10:12:06

+0

在进程中总是有一个线程(主线程,如@Maister提到的那样)。但是GDB不能告诉你关于线程的任何信息,除非你使用线程库链接。 – jalf 2011-04-22 10:04:11

1

操作系统创建与一个线程的处理空间,并调用应用程序加载器来执行在该线程,这又执行一些初始设置的应用程序(收集命令行参数成argcargv,例如),并调用main

+0

请检查更新的问题 – 2011-02-25 10:05:15

0

对于示例应用程序,当我用-lpthread编译它时,它显示1个线程正在运行。 所以lpthread在这里扮演关键角色。

(gdb) break main 
Breakpoint 1 at 0x400793: file threadtest.cpp, line 3. 
(gdb) run 
Starting program: /home/vivek/Desktop/a.out 
[Thread debugging using libthread_db enabled] 

Breakpoint 1, main (argc=1, argv=0x7fffffffe728) at threadtest.cpp:3 
3   std:: cout<<"Will I have any thread"; 
(gdb) info threads 
* 1 Thread 0x2aaaaaac8bb0 (LWP 21649) main (argc=1, argv=0x7fffffffe728) 
    at threadtest.cpp:3 
(gdb)