如何创建LLDB脚本以忽略SIGSEGV和SIGBUS

时间:2018-09-18 01:07:33

标签: matlab lldb

我经常在lldb中运行matlab来调试一些共享库,并希望制作一个lldb脚本,而不是键入以下两行。

process handle --pass true --stop false --notify true SIGSEGV process handle --pass true --stop false --notify true SIGBUS

我可以在〜/ .lldb / ignore_sigs创建一个文件 但我不确定要在该文件中放什么。

3 个答案:

答案 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.