2011-02-25 41 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)