2017-03-01 4 views
0

MacOS에 설치 한 C 언어 기반 응용 프로그램의 lldb에 많은 중단 점을 설정했습니다. 중단 점은 대부분 응용 프로그램에서 같은 기능으로 설정되었습니다. 그러나 다음 날 응용 프로그램으로 돌아가서 작업을 계속하고 동일한 기능에서 중단 점을 다시 설정하기 시작했습니다. 중단 점이 응용 프로그램 기능 내부에서 발생하지 않고 하나의 함수의 기본 라이브러리 (예 : 기본 라이브러리에서 멈춤)를 반복 할 때마다 반복적으로이 작업을 계속 수행하며 스테핑으로 원하는 함수에 도달 할 수 없습니다 (매 단계마다 , 그것은 기본 라이브러리에서 앞으로 나아 간다).프로그램에 신호를 전달하도록 LLDB에 지시하는 방법

업데이트 :

내가 시그널 핸들러 내에서 호출에 중단 점을 설정하고 함수입니다. 예를 들어 SIGINT 신호를 보내면 신호 처리기가 응용 프로그램에서 정리할 함수를 호출하고 해당 정리 중 하나에 중단 점을 설정합니다. 경우에 따라 LLDB는 중단 점을 (stop reason = breakpoint 1.1과 함께) 설정하는 기능에서 멈추는 경우가 있습니다. 때로는 stop reason = signal SIGSTOP이 포함 된 기본/포함 이벤트 처리 라이브러리에서 중지되고, 후자 인 경우 "c"를 누르면 (중단 점에 계속하기 위해) 응용 프로그램이 희망적으로 그리고 이벤트 처리 라이브러리에서 빠져 나옵니다.) 때때로, 단지 원하는 중단 점에 계속 진행할 수 있습니다. 다른 경우에는 "Process 41524 resuming"이라고 말하면서 원하는 중단 점에 도달 할 수 없습니다. AFAIK (OP를 참조, 고정되지 않은 문제, 그래서 이것은 좋은 해결책이 아니다 다음 .lldbinit 파일에 target.inline-breakpoint-strategy 설정을 추가, 문제 해결 가이드에서 언급 한 바와 같이

+0

Xcode를 사용하여 중단 점 또는 명령 줄 lldb를 설정하고 있습니까? Xcode의 경우 캐시 중단 점을 수행하지만 중단 점 탐색기에서 중지 할 수 있습니다. –

+0

명령 줄 lldb 인 경우 디버깅중인 프로그램을 다시 실행할 때마다 활성 상태로 설정하고 중단 점을 유지하지만 lldb 자체 실행에서 캐싱을 수행하지 않습니다. –

+0

"break list"명령의 출력과 예기치 않게 충돌하는 중단 점 번호를 제공 할 수 있다면 어쩌면 우스운 이야기를 볼 수 있을까요? –

답변

2

아, 그렇다면 문제는 중단 점이 아니라 신호 처리기가 실제로 호출되는지 여부와 관련이 있다고 생각합니다.

대부분의 디버거에는 신호를 수신 할 때 일어나는 일을 제어 할 수있는 방법이 있습니다. lldb에서 이는 process handle 명령을 통해 수행됩니다. 예를 들어 :

lldb이 프로세스가 SIGSTOP을 부여 할 때 중지하고, SIGSTOP에 대해 알려하지만, 프로그램이 디버깅에 SIGSTOP를 통과하지 않을 것이다 (따라서 핸들러는 의미
(lldb) process handle SIGSTOP 
NAME   PASS STOP NOTIFY 
=========== ===== ===== ====== 
SIGSTOP  false true true 

인수가없는 process handle은 모든 신호에 대한 행동 목록을 제공합니다.

SIGSTOP은 디버거가 자체 용도로 사용하기 때문에 기본적으로 SIGSTOP을 전달하지 않으므로 "실제"SIGSTOP에서 가져 오지 않은 핸들러를 호출 할 수 있습니다. 동일은 SIGINT의, 같은 이유로, 사실이다 :

(lldb) process handle SIGINT 
NAME   PASS STOP NOTIFY 
=========== ===== ===== ====== 
SIGINT  false true true 
쉽게 SIGINT에 대한 예를 들어,이 동작을 변경할 수 있습니다

:

(lldb) process handle SIGINT -p true 
NAME   PASS STOP NOTIFY 
=========== ===== ===== ====== 
SIGINT  true true true 

그런 다음 디버거가 프로세스에 SIGINT를 전달합니다 , 그리고 그것은 당신의 처리기에서 멈출 것이다.

+1

좋습니다, 감사합니다. 나는 아무것도 변경되지 않았다고 가정합니다 (즉, 프로세스를 시작하기 전에 구성 할 수 없습니다) 2013 년이 질문에 대한 답변 이후 http://stackoverflow.com/questions/16989988/disable-signals-at-lldb-initialization 나는' 도움 프로세스 처리'와 더 많은 정보를 찾지 못했습니다 – Leahcim

+0

예, 아직 해결되지 않았습니다. –

0

문제를

"settings set target.inline-breakpoint-strategy always" >> ~/.lldbinit 

업데이트를 해결하기 위해 듯)

+0

'.lldbinit'에이 라인을 추가하는 것은 잠시 동안 작동했지만 OP – Leahcim

+0

에 설명 된 동작으로 되돌아갔습니다. "존재하지 않는 중단 점에서 멈추다"는 것은 무엇을 의미합니까? 당신이 멈 추면 lldb의 중지 이유 "breakpoint x.x"또는 EXC_BREAKPOINT입니까? 후자의 경우, 이것은 중단 점 lldb 집합이 아니지만 어설 션에서 동일한 트랩을 사용하는 일부 시스템 라이브러리입니다. 이 사건의 예가 많은 경우 EXC_BREAKPOINT에 대한 StackOverflow를 검색하십시오. –

+0

OP를보다 자세한 정보로 업데이트했습니다. – Leahcim

관련 문제