Как сообщить LLDB передать сигнал в программу

Я установил много точек останова в lldb для приложения на языке C, которое я установил на свой MacOS. Точки останова в основном устанавливались в одной и той же функции в приложении. Однако на следующий день, когда я вернулся к приложению, чтобы продолжить работу над ним, и снова начал ставить точки останова в той же функции, возникла проблема в том, что останов произошел не внутри функции приложения, а в одном из базовые библиотеки приложения, и оно продолжает делать это снова и снова каждый раз, когда я пытаюсь взломать функцию (т. е. она останавливается в базовой библиотеке), и я не могу достичь желаемой функции, шагая , он просто делает шаг вперед в базовой библиотеке).

Обновлять:

Функция, в которой я устанавливаю точку останова, вызывается из обработчика сигнала. Например, когда я отправляю сигнал SIGINT, обработчик сигнала вызывает некоторые функции для очистки в приложении, и я устанавливаю точку останова на одной из этих функций, которые очищают. Иногда LLDB останавливается в функции, в которой я установил точку останова (с помощью stop reason = breakpoint 1.1), иногда она останавливается в базовой/включенной библиотеке обработки событий с помощью stop reason = signal SIGSTOP и, если последнее, если я нажимаю «c» (чтобы продолжить работу с точкой останова в приложение, надеюсь, и из библиотеки обработки событий), только иногда оно позволяет мне перейти к нужной точке останова, в других случаях просто говорит «Процесс 41524 возобновляется», и я никогда не могу добраться до нужной точки останова.


person Leahcim    schedule 01.03.2017    source источник
comment
Вы используете Xcode для установки точек останова или командной строки lldb? Если Xcode, он кэширует точки останова, но вы можете отключить их в навигаторе точек останова.   -  person Jim Ingham    schedule 02.03.2017
comment
Если это командная строка lldb, она не кэширует от запуска к запуску саму lldb, хотя сохраняет установленные вами точки останова активными и сбрасывает их каждый раз, когда вы перезапускаете отлаживаемую программу.   -  person Jim Ingham    schedule 02.03.2017
comment
Если вы можете дать вывод команды списка останова и номер точки останова, которую вы неожиданно нажали, может быть, мы увидим что-то смешное?   -  person Jim Ingham    schedule 02.03.2017
comment
Я обновил заголовок вопроса, чтобы решить проблему, с которой я столкнулся, когда выяснилось, что это не проблема, связанная с кешем.   -  person Leahcim    schedule 02.03.2017
comment
@JimIngham Решение, которое я опубликовал в своем ответе, работает некоторое время, но затем оно возвращается к поведению в OP. Любые предложения относительно того, что проблема может быть? он снова останавливается в базовой библиотеке.   -  person Leahcim    schedule 02.03.2017


Ответы (2)


Ах, тогда я не думаю, что проблема была в точках останова, а в том, действительно ли вызывался ваш обработчик сигналов.

У большинства отладчиков есть способ управлять тем, что происходит при получении сигнала. В lldb это делается с помощью команды process handle. Например:

(lldb) process handle SIGSTOP
NAME         PASS   STOP   NOTIFY
===========  =====  =====  ======
SIGSTOP      false  true   true 

Это означает, что lldb остановится, когда вашему процессу будет передан SIGSTOP, и уведомит вас об этом SIGSTOP, но НЕ передаст SIGSTOP программе, которую вы отлаживаете (и, таким образом, ваш обработчик не будет вызван для SIGSTOP). process handle без arguments даст вам список вариантов поведения для всех сигналов.

Мы не передаем 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 процессу, и он остановится в вашем обработчике.

person Jim Ingham    schedule 07.03.2017
comment
Спасибо. Я предполагаю, что ничего не изменилось (т.е. его нельзя настроить перед запуском процесса) с момента вашего ответа в 2013 году на этот вопрос stackoverflow.com/questions/16989988/ Я запустил help process handle и не нашел больше информации - person Leahcim; 07.03.2017
comment
Да, это еще не исправили. - person Jim Ingham; 07.03.2017

Как упоминалось в руководстве по устранению неполадок, добавление параметра target.inline-breakpoint-strategy в файл .lldbinit, похоже, решило проблему.

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

Обновление: проблема не исправлена, см. ОП, так что это не очень хорошее решение (насколько мне известно).

person Leahcim    schedule 02.03.2017
comment
добавление этой строки в .lldbinit работало некоторое время, но затем оно вернулось к поведению, описанному в OP - person Leahcim; 02.03.2017
comment
Что вы подразумеваете под остановкой на несуществующей точке останова? Когда вы останавливаетесь, является ли причиной остановки lldb точка останова x.x или EXC_BREAKPOINT? Если последнее, то это не набор точек останова lldb, а какая-то системная библиотека, использующая ту же ловушку в утверждении. Найдите в StackOverflow EXC_BREAKPOINT множество примеров того, как это происходит. - person Jim Ingham; 03.03.2017