2011-02-25 3 views
0

gdb로 내 응용 프로그램을 디버깅하고있었습니다. break main을 사용했습니다. main이 호출되면 중단 될 수 있습니다. thread info을 사용하면 스레드 수가 1임을 알 수 있습니다.GDB가 비 스레드 응용 프로그램에서 1 스레드를 표시합니다.

주 전에 스레드가 시작되는 방법은 무엇입니까? 내 전화에서 스레드가 생성되는 곳에서 스레드 호출이 없습니다. 나는 모든 프로그램이 단일 스레드로 시작하는 경우하는지 테스트하는 샘플 프로그램을 작성했습니다 이러한 libs와

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) 

같은 정보를 보여주지는 마라. 1 개의 프로세스가 아니라 1 개의 프로세스를 보여줍니다.

-lpthread를 사용하여 컴파일하면 스레드가 1 개 표시됩니다.

그래서 우리는 lpthread를 사용할 때 한 스레드로 시작합니까? 또는 GDB는 이와 같이 동작합니까?

+1

이 스레드가 기본 스레드입니까? – p4553d

답변

2

모든 프로그램에는 적어도 하나의 스레드 인 주 스레드가 있습니다. C++ 런타임이 생성자를 가진 모든 전역 객체를 호출하는 것처럼 main()이 시작되기 전에 일부 초기화를 수행하기 때문에 main보다 먼저 프로그램이 시작됩니다.

+0

예제 프로그램 gdb show 1 스레드에서 연결에 -lpthread를 사용할 때. 그러나 그것이 아니라면 하나의 과정을 보여줍니다. 그래서 우리는 lpthread를 사용할 때 한 스레드로 프로그램을 시작합니까? 또는 GDB는 이와 같이 동작합니까? –

+0

프로세스 내에 항상 스레드 (@Maister가 언급 한 주 스레드)가 있습니다. 그러나 스레딩 라이브러리와 연결하지 않으면 GDB는 스레드에 대해 말할 수 없습니다. – jalf

1

운영 시스템은 하나 개의 스레드와 프로세스 공간을 생성하고 (예를 들어, argcargv에 명령 행 인수 수집) 턴 일부 초기 설정을 수행하는 스레드의 프로그램을 실행하는 프로그램 로더를 호출 main 호출 .

+0

업데이트 된 질문을 확인하십시오. –

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) 
관련 문제