2016-08-30 1 views
1

Brainfsck에서 만델 브로 집합을 계산하는 MIPS32r6 프로그램에서 중단 점을 설정하려고합니다. 프로그램 자체는 Clang으로 컴파일 된 C++로 작성되었으며 LLDB로 디버깅 중입니다.lldb를 사용하여 디버깅 할 때 더 높은 줄 번호가 중단 점으로 해석되지 않습니다.

내가 가지고있는 문제는 LLDB에서 문제가없는 주로 낮은 줄 번호에 특정 중단 점을 설정할 수 있다는 것입니다. 그러나 Main.cpp의 Line # 70 이후에 중단 점은 '중단 점 목록을 실행하면 완전히 합리적인 주소로 표시되지만'해결되지 않음 '으로 표시됩니다. 말하자면, 라인 # 70 이후에 설정하려고하는 모든 중단 점이 해결되지 않고 올라오고, 모두 라인 # 70 전에 합리적인 중단 점이 문제없이 해결됩니다.

내가 여기에 연결 한 이진의 복사본을 배치 한

: http://filebin.ca/2tJzo2LLBJWO/MipsTest.bin

그리고 여기하여 Main.cpp의 사본 : https://paste.ee/p/WYs8Y

내가 구축하고 다음 옵션 :

clang -mcompact-branches=always -fasynchronous-unwind-tables -funwind-tables -fexceptions -fcxx-exceptions -mips32r6 -O0 -g -glldb ... 

lld --discard-none -znorelro --eh-frame-hdr ... 

이 시점에서 나는이 문제의 원인이 무엇인지 확신 할 수 없습니다.

답변

1

나는 Lldb가 라인 테이블을 어떻게 생각하는지 알기 위해 lldb에서 target modules dump line-table Main.cpp을 시도하려고합니다. 그런 다음 readelf --debug-dump=decodedline MipsTest.bin과 같은 바이너리 DWARF 라인 테이블을 봅니다 (필자는 웹에서 readelf 메인 페이지를보고 있습니다).

+0

' 타겟 모듈의 덤프 행 테이블 Main.cpp'는 유효하게 보이며, 라인 248 ('main'에있는 유일한 함수의 마지막 라인입니다)까지 올라갑니다. 'readelf '에 표시된 것처럼 또한 유효하며 또한 248 행을 읽습니다. – ameisen

1

은 샘플 바이너리를 사용하여, 나는 얻을 :

(lldb) b s -l 72 
Breakpoint 1: where = MipsTest.bin`main + 544 at Main.cpp:72, address = 0x000134a0 

그래서 우리는 중단 점에 주소를 발견했다. 그것이 실행될 때 해결되지 않으면 그 주소에 중단 점을 구현할 수 없다는 것을 의미합니다 (예를 들어 어떤 이유로 프로그램 메모리에 트랩을 쓸 수 없음).

+0

우리는 지금 lldb-dev 보드에서이 작업을하고 있다고 생각합니다 (http://lists.llvm.org/pipermail/lldb-dev /2016-August/11146.html), 여기서도 후속 작업을 진행합니다. 디버거가 실제로 아무 것도 시도하지 않는다는 것을 알지 못합니다. 70 줄에 중단 점을 설정하면 Z0을 스텁 (breakpoint를 설정)에 보냅니다. 중단 점을 72 행으로 설정하면 스텁에 아무 것도 전송하지 않으므로 트랩을 설정할 수 있는지 여부를 결정하지 않았습니다. BBS 게시물마다 바이너리의 .text 섹션이 완전히 합리적으로 보입니다. – ameisen

관련 문제