2012-05-02 4 views
3

Linux에서 응용 프로그램의 문제점을 디버그하려고합니다. 무작위로 SIGSEGV를 사용하면 libstdc++.so 또는 libstdc.so으로 충돌하는 경향이 있습니다.Linux에서 스레딩 문제를 해결하는 방법은 무엇입니까?

내가 추가 한 스레드의 작업이 매우 고립되어 있으므로 어디에서든 경쟁 조건이없는 것처럼 보입니다. 그러나 거의 항상 충돌합니다.

응용 프로그램이 g++ -c ... -pthread -D_REENTRANT 컴파일 및 g++ -pthread -o ...

와 연결하지만 여전히 libstdc*.so 기능 중 하나에 거의 모든 시간을 충돌 것입니다. 나는 무엇이 잘못 되었는가를 알아 내려고 노력하면서 며칠을 낭비했다 ...

어떤 조언이 있으십니까? libstdc*.so이 스레드를 인식하도록 컴파일되어 있는지 확인하는 방법이 있습니까? 나를 도울 수있는 모든 gdb 명령들? 디버깅 힙?

내가 몇 년 동안 리눅스와 함께 일하고 있어요, 그래서 잃었어요 ...

+0

코드의 관련 섹션을 게시 할 수 있습니까? – hmjd

+0

당신은 그 벌레 깡통을 가진 겨자를 원하십니까? – PlasmaHH

+0

@hmjd : 불행히도 멀티 스레드 용으로 확장 된 이미 큰 코드베이스입니다. 하위 집합에 대한 복제 시나리오를 만들 수 없습니다. 따라서 나는 도움이 될 수있는 기술을 찾고 있습니다. 그게 내가 할 수있는 전부입니다. – Coder

답변

4

당신이해야 할 몇 가지가 있습니다

를 사용하여 응용 프로그램을 실행 사용하여 응용 프로그램을 실행

단위 테스트를 작성하십시오. 스레드에 대한 문제를 찾는 데 많은 도움이되지는 않지만 잘못된 메모리 액세스 문제를 찾아내는 데 많은 도움을 줄 수 있습니다.

4

아직 컴파일하지 않았다면 컴파일 할 때 -g을 사용해보십시오. 상징적 인 디버거 정보를 얻으려고합니다.

코어가 버려지나요? 그래서 당신은 실행에 핵심을로드 할 수 gdb를 사용할 수있는 경우 다음과 같이

gdb <my-exe> <my-core-file> 

번 (당신이 -g 컴파일 추정)는 모든 스레드 스택의 목록을 얻으려면 info threads를 사용하여 좀 걸릴 수 있습니다로드 문제를 일으킨 thread seg 오류를 일으킨 스택 추적을 수행하여 libstdc++.so 또는 libstdc.so에서 백업하는 경우 상황이 어떻게되는지 분명해야합니다. 적어도 그것은 당신을 적당한 지역으로 데려다 줄 것입니다.

코어가 없으면 디버거 자체에서 앱을 실행할 수 있습니까? 간단하게 사용하여 프로세스에 연결 :

gdb <my-exe> <my-process-id> 

서로를 고정하는 두 개의 스레드를 찾아

이 기술은 스레드 교착 상태의 바닥에 점점 FO 매우 유용합니다.

+0

'gdb myapp','r','SIGSEGV','bt','info threads'를 통해 앱을 시작합니다. 호출 스택이 있지만'libstdc * .so's 내의'malloc'과'new'에 실패했습니다 – Coder

+0

런타임 라이브러리 설치가 엉망이거나 빌드 환경과 런타임 환경 사이에 호환성이 없다는 소리가납니다. 처음부터 모든 것을 다시 빌드하고'LD_LIBRARY_PATH' 또는 동등한 항목을 확인 했습니까? –

+0

확실하지만, 어떤 함수가'malloc'과'new's를 호출하고 있습니까? 소프트웨어 스택과 관련된 기능을 볼 때까지 호출 스택을 살펴보고 clib에있는 것이 아닙니다. – snies

관련 문제