10

私のソフトウェアは SIGUSR2 シグナルを使用し、LLDB (Xcode 4.6.2 で) をデバッガとして使用しています。LLDB が SIGUSR2 で停止しないようにするには、次のコマンドを使用します。

process handle --pass true --stop false --notify true SIGUSR2

LLDB が起動時に常にこのコマンドを実行する方法を探しています。.lldbinitの行に沿って何かを追加することを検討しましsettings append target.process.extra-startup-command processたが、これにより target.process.extra-startup-command 設定の値が変更されますが (コマンドによって証明されるsettings showように)、使用できるかどうか、またはどのように使用できるかは不明ですこの設定により、常にprocess handleコマンドを実行して SIGUSR2 シグナルを無効にします。

ここに投稿された「解決策」を認識しています: Permanently configure LLDB (in Xcode 4.3.2) to stop on signal。ただし、存在する場合は、よりエレガントなソリューションを探しています。

4

3 に答える 3

6

現時点では、これをブレークポイント コマンドで実行するという提案が、main利用可能な最も洗練されたソリューションです。

gdb には、どのシステム上にあるかに関係なく、すべてのプロセスが魔法のように UNIX シグナルに応答する世界観がありました。したがって、プロセスが SIGINT を取得したときに何が起こるかを説明することは理にかなっています。たとえば、プロセスを作成する前です。lldb では、プロセスが作成されると、そのシグナルとそのデフォルトの動作が通知されます。これは素晴らしいことですが、プロセスを実行する前にシグナル動作の構成オプションを保存する自然な場所がないことを除けば. これは、追加する必要があるものです。

「プロセスの起動」だけでなく、「プロセスの終了」や「共有ライブラリのロード」などの「プロセスのライフサイクルイベント」をトリガーする機能は、優れた追加機能です。この機能は、そのようなバグが機能の投票として機能するため、機能強化リクエスト ( http://bugreport.apple.com/ ) を提出するのに最適です。

ところで、target.process.extra-startup-commandまったく違うことをします。これにより、実行を開始する前に、lldb がデバッグ エージェント (例: debugserver) に送信するシーケンスの先頭にいくつかのコマンドを追加できます。その主な用途は、debugserver のロギングをさらに有効にすることです。

于 2013-06-07T22:00:23.777 に答える
5

これを構成するために定期的にこの質問に戻るので、最終的には自動的に実行する小さなスクリプトを作成しました。

import lldb
import threading

class ProcessEventListener(threading.Thread):
    def __init__(self, debugger):
        super(ProcessEventListener, self).__init__()
        self._listener = debugger.GetListener()
        self._debugger = debugger
        self._interpreter = debugger.GetCommandInterpreter()
        self._handled = set()

    def _suppress_signals(self, process):
        signals = process.GetUnixSignals()
        signals.SetShouldStop(11, False)

    def run(self):
        while True:
            event = lldb.SBEvent()
            if not self._listener.PeekAtNextEvent(event):
                continue                
            process = self._interpreter.GetProcess()
            if process and not process.GetUniqueID() in self._handled:
                self._suppress_signals(process)
                self._handled.add(process.GetUniqueID())

def __lldb_init_module(debugger, *rest):
    listener_thread = ProcessEventListener(debugger)
    listener_thread.start()

使用するには、次のようなものに入れてignore_signals.pyから参照し.lldbinitます。

command script import ~/ignore_signals.py

これはさらに改善できると思うので、貢献したい人がいる場合に備えて GitHubにも投稿しました。

于 2019-08-31T14:34:19.500 に答える