GDB는

2013-11-20 4 views
1

내가 gdb를 사용하여이 시작 소스를 찾을 수없는 (작업 디렉토리 인/홈/레온/개발/테스트// 원자) :GDB는

gdb ./bin/lin64/httpress 

가 그럼 난 소스 파일과 디렉토리를 추가하고 나를 이해 : 내 바이너리를 실행하면

Source directories searched: /home/leon/Develop/tests/atomic/third/http_parser:/home/leon/Develop/tests/atomic/src/tools:$cdir:$cwd 

은, GDB는 segfault의 일이 내 소스 코드에 라인을 인식하지 못합니다. gdb 용 소스 파일을 설정하는 방법은 무엇입니까?

gcc -D_AMD64_ -D_LIN_ -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -m64 -march=core2 -O2 -Wall -I. -I src/include -I src/lib/zlib/ -I src/lib/otg -I third/openssl/include/ -I src/lib/otg/Tools/HostTime/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Cross -I src/lib/otg/Tools/OpenToolsGate/Common/Interfaces/ -o bin/lin64/httpress -std=c99 -lpthread -lev -lgnutls -O2 -s -DWITH_SSL -Wno-strict-aliasing \ 
     -I /usr/include/libev src/tools/httpress.c -I third/http_parser/ third/http_parser/http_parser.c 

좋아, 내가 만든 한 몇 가지 변화 :이 경우

gcc -g -ggdb -D_AMD64_ -D_LIN_ -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -m64 -march=core2 -Wall -I. -I src/include -I src/lib/zlib/ -I src/lib/otg -I third/openssl/include/ -I src/lib/otg/Tools/HostTime/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Cross -I src/lib/otg/Tools/OpenToolsGate/Common/Interfaces/ -o bin/lin64/httpress -std=c99 -lpthread -lev -lgnutls -s -DWITH_SSL -Wno-strict-aliasing \ 
     -I /usr/include/libev src/tools/httpress.c -I third/http_parser/ third/http_parser/http_parser.c 

여전히 이진 심볼을 찾을 수없는

이 프로그램은 GCC로 컴파일 . 그러나 gcc 호출에서 -s 옵션을 제거하면.

Reading symbols from /home/leon/Develop/tests/atomic/bin/lin64/httpress...done. 

을하지만 디버거는 여전히 말한다 : 그것은 기록

(gdb) info source 
No current source file. 

을 ... 나는 그에게 소스와 디렉토리를 가리 킵니다 후.

+0

프로그램을 실행하지 않는 경우,'info source'가'No current source file'을 반환한다는 것이 정상입니다.'정보 출처'를 사용해 보셨습니까? – jcm

답변

4

디버그 정보를 포함하도록 gcc 호출에서 -g 전화가 누락되었습니다. 한편

, 나는 -O2에서 -O0에 최적화 레벨을 감소 번만 사용하는 것이 좋습니다 (포함 gcc 호출이 -O2있다).

이 외에도 dir 명령을 사용하여 gdb의 소스 경로에 디렉토리를 추가 할 수 있습니다 : Source_Path. 그러나 이것은 단지 당신이 httpress

+1

gdb는 이미 디버깅 기호 (-s 옵션을 제거함)를보고 있지만 소스를 찾지 못하는 것 같습니다. – Leonid

+0

@Leonidas 질문의 업데이트에 대한 의견을 확인하십시오. 'info source' 대신'info sources'를 시도하십시오. – jcm

2

제거 최적화 플래그에서 사용할 적절한 디버그 정보를 한 경우 일 것이다 :

-O2 

을 그리고 플래그 것을 추가

-g -ggdb 
2

그러나 디버거가 여전히이 말한다 :

(gdb) 정보 출처
현재 소스 없음 전자 파일.
... 나는 그에게 근원을 가진 그에게 전화 번호부를 가르키고 난 후에.

이는 을 것으로 예상된다. 바이너리를 아직 실행하지 않았기 때문에 현재 소스가 없습니다.

start 또는 run 바이너리를 사용하고 실행중인 곳 (예 : main 또는 충돌 지점)으로 보내려고합니다.

관련 문제