我经常在lldb中运行matlab来调试一些共享库,并希望制作一个lldb脚本,而不是键入以下两行。
process handle --pass true --stop false --notify true SIGSEGV
process handle --pass true --stop false --notify true SIGBUS
我可以在〜/ .lldb / ignore_sigs创建一个文件 但我不确定要在该文件中放什么。
答案 0 :(得分:0)
“进程句柄”的工作方式,必须有一个正在运行的进程才能将信号行为附加到该进程;它不遵守目标。因此,一旦有了流程,您将需要执行此操作。最简单的方法是在.lldbinit文件的main上设置一个断点,然后将命令添加到该断点:
break set -n main -C "process handle..." -C "process handle..."
.lldbinit文件中设置的断点将被所有lldb调试会话继承。如果只希望将其应用于您的matlab调试会话,则可以执行一个Python命令来检查目标可执行文件的名称,如果process handle
是matlab,则只执行它,然后运行进程句柄命令。然后,您可以从断点调用该Python命令,如上所示。
答案 1 :(得分:0)
我最终在〜/ .lldb / ignoreSigs.py
中创建了一个文件具有以下内容
import lldb
def ignoreSigs(debugger, command, result, dict):
debugger.HandleCommand("process handle --pass true --stop false --notify true SIGSEGV")
debugger.HandleCommand("process handle --pass true --stop false --notify true SIGBUS")
def __lldb_init_module (debugger, dict):
debugger.HandleCommand('command script add -f ignoreSigs.ignoreSigs ignoreSigs')
然后我将以下行添加到〜/ .lldbinit
comma script import ~/.lldb/ignoreSigs.py
启动matlab之后,我可以通过
禁用信号matlab -Dlldb
run
#Wait for first signal to occur.
ignoreSigs
答案 2 :(得分:0)
Jim Ingham 的方法对我有用,唯一的缺点是 main
中的断点在不同的函数中被多次击中,例如当 iOS 应用程序进入后台时。我添加了 -o true
,现在它只点击了一次:
break set -n main -o true -C "process handle --stop false --notify false SIGUSR1 SIGUSR2"
从 lldb 的帮助中得到的:
lldb
help breakpoint set
-o <boolean> ( --one-shot <boolean> )
The breakpoint is deleted the first time it stop causes a stop.