如何根据芯片类型(M1/Intel)导入Facebook的Chisel fbchisellldb.py?

How to import Facebook's Chisel fbchisellldb.py depend on the chip type(M1/Intel)?

我在 ~/.lldbinit.

添加以下 shell 代码
if [[ $(uname -p) == 'arm' ]]; then
    command script import /opt/homebrew/opt/chisel/libexec/fbchisellldb.py
fi

if [[ $(uname -p) == 'i386' ]]; then
    command script import /usr/local/opt/chisel/libexec/fbchisellldb.py
fi

script fbchisellldb.loadCommandsInDirectory('/path/to/fbchisellldb.py')

但事实证明.lldbinit 不支持shell code/syntax,检测芯片类型并动态导入的正确方法是什么fbchiselldb.py。

error: 'if' is not a valid command.
error: error: No value
error: error: No value
error: error: No value
error: error: No value
Error loading Chisel (errno None)
error: 'if' is not a valid command.
error: module importing failed: invalid pathname
error: error: No value
error: error: No value
error: error: No value
error: error: No value
Error loading Chisel (errno None)

lldb 将脚本任务委托给脚本解释器。我们认为 Python 的人在创造可用的语言方面会比我们想出的任何东西做得更好,而且 Python 是众所周知的,所以我们不会强迫人们学习另一组 shell 的怪癖,比如 if 测试和循环结构。因此,如果您需要在与 lldb 的交互中使用逻辑测试和循环,您可以在 Python 中使用脚本命令或通过导入模块来实现。

你可以在你的 ~/.lldbinit 中使用 script 命令 one-lines,或者你可以将脚本文本内联到你的 .lldbinit 中,但我通常在 ~ 中保留一个 .py 文件/.lldb 我在 .lldbinit 中 command script import,并让它完成这种工作。以这种方式添加和调试更容易。

如果你输入一个函数的形式:

def __lldb_init_module(debugger, dict):

在 Python 模块中,当使用 command script import 导入模块时,lldb 将 运行 该函数(这是使用 command script importscript import).这允许您向导入此模块的调试器添加命令。

所以你可以这样做:

import platform

def __lldb_init_module(debugger, dict):
    if platform.machine() == 'arm64':
        debugger.HandleCommand("command script import <ONE_CHISEL>")
    else
        debugger.HandleCommand("command script import <OTHER_CHISEL>")