Reveal的LLDB集成方式

使用LLDB简化Reveal集成流程
本文介绍了一种利用LLDB方式简化Reveal集成的方法,通过配置路径和设置命令,避免了繁琐的手动操作,实现一键加载和启动Reveal。

在上一篇文章中,我介绍了用framework的方式去配置Reveal,但是这种方式很繁琐,因为每分析一个工程你都得去添加一次Reveal的framework 并且配置一次Other Linker Flags

而且等你打包测试或者打包上架的时候你还要把Reveal的framework给剔出来。这里给大家分享一种新的方式来玩转Reveal集成->LLDB方式,这种方式就可以避免上面的问题。LLDB集成听上去挺 Heigher-Bigger的,其实是很简单的两步:配置路径、设置命令。


一、配置路径

先启动你的Reveal,要配置路径,首先你得找到Reveal的路径,主要就是Reveal中libReveal.dylib包的路径。先找到你下载安装的Reveal,右键->显示包内容


在打开的路径中展开Contents文件,找到libReveal.dylib目标文件,然后右键->显示简介就可以得到目标文件的路径


这里我得到的路径是 /Users/apple/Downloads/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib,保存该路径备用。然后创建一个新的Xcode工程 LLDBSetReveal.xcodeproj,随便添加点什么内容在程序中(显示效果)。启动Xcode工程,等Xcode正常启动后再暂停工程进入LLDB模式


输入第一行命令 : expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void*)dlopen("/Users/apple/Downloads/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void *)0),等有响应的时候再输入第二条命令 expr (void)[(NSNotificationCenter*)[[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil]; 


输入命令完毕后出现 INFO: Reveal Server started (Protocol Version 25). 就是配置成功了



二、设置命令
如果每次都要输入这两条命令的话更繁琐了,要解决这个问题我们就得在.lldbinit里面设置别名了。打开终端键入 touch ~/.lldbinit命令回车,然后键入open ~/.lldbinit命令回车,在新建的文本编辑器中输入之前的两步命令:红色的是命令格式,蓝色标注的是命令别名,其余的就是上面步骤中的两条命令

command aliaslwq_reveal_load expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Users/apple/Downloads/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0)


command alias lwq_reveal_start expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];


测试一下,重启Xcode工程,然后暂停进入LLDB模式,分别输入命令 lwq_reveal_load  lwq_reveal_sTart 






"/Users/apple/Downloads/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib"

"/Users/apple/Downloads/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib"

r

 

<think> 我们正在解决一个具体问题:在Mac系统下使用VSCode配置C/C++环境时,`'console': 'externalTerminal'`属性不被允许的问题。 根据之前的对话,我们知道用户尝试配置`launch.json`文件,希望使用外部终端(如Mac的Terminal.app)来输出程序结果,但遇到了属性不被允许的错误。 分析原因: 在VSCode中,`launch.json`的配置项取决于所使用的调试器(debugger)。对于C/C++,常见的调试器有: - Windows: Windows Debugger (cppvsdbg) - Linux: GDB (cppdbg) - macOS: LLDB (lldb) 在Mac系统上,默认使用的调试器是LLDB(通过C/C++扩展提供)。不同的调试器支持的`console`属性值可能不同。 查阅VSCode官方文档关于调试配置的说明: - `console`属性用于指定程序输出的位置。 - 对于LLDB调试器,`console`属性支持的取值包括: "internalConsole"(默认,VSCode内置调试控制台) "integratedTerminal"(VSCode内置终端) "externalTerminal"(外部系统终端) 然而,实际使用中,用户可能会遇到在`launch.json`中设置`"console": "externalTerminal"`时,VSCode提示该属性不被允许(例如,在配置验证时出现警告或错误)。 原因可能: 1. 调试器类型(`type`)设置错误:例如,错误地使用了`cppdbg`(用于GDB)而不是`lldb`。 2. VSCode的C/C++扩展版本问题:旧版本可能不支持在LLDB调试器下使用`externalTerminal`选项。 3. 配置位置错误:`console`属性应该放在`configurations`数组的每个配置对象中,而不是顶层或其他位置。 解决方法: 1. 确保`launch.json`中的调试器类型设置为`lldb`(针对Mac系统): "type": "lldb" 2. 更新C/C++扩展至最新版本。 3. 检查配置结构是否正确。 此外,如果仍然无法使用`externalTerminal`,我们可以考虑使用`integratedTerminal`(VSCode内置终端)作为替代方案,它通常也可以正常处理输入输出,且避免外部终端窗口的弹出。 但用户明确要求使用外部终端,所以我们提供两种方案: 方案一:修复`externalTerminal`配置(推荐更新扩展后重试) 方案二:使用`integratedTerminal`,并配置内置终端以支持输入(通常默认即可) 步骤: 方案一:修复外部终端配置 1. 打开`launch.json` 2. 确保配置如下: { "name": "(lldb) Launch", "type": "lldb", // 确保这里是lldb "request": "launch", "program": "${workspaceFolder}/${fileBasenameNoExtension}", "args": [], "cwd": "${workspaceFolder}", "console": "externalTerminal", // 外部终端 "preLaunchTask": "你的编译任务名称" } 3. 保存并尝试调试。 如果问题依旧,尝试更新C/C++扩展: - 在VSCode的扩展视图中,找到"C/C++"扩展,检查更新并安装最新版。 方案二:改用内置终端(如果外部终端实在无法使用) "console": "integratedTerminal" 内置终端在VSCode内部,使用起来比较方便,而且可以避免外部终端窗口的弹出和关闭。 特殊情况:如果用户使用的是较新的Mac(如M1芯片),并且使用的是VSCode Insider版本或其他特殊版本,可能需要检查是否兼容。 另外,如果用户想使用外部终端,也可以考虑通过自定义任务(task)来运行程序,而不依赖调试配置。即: - 配置一个任务(在tasks.json中)用来编译并运行程序(使用外部终端命令)。 - 然后通过运行任务来执行程序(而不是调试)。 自定义任务示例(运行已编译的程序): 在tasks.json中添加: { "label": "Run in Terminal", "type": "shell", "command": "open", // Mac的open命令可以打开终端运行程序 "args": [ "-a", "Terminal.app", "${workspaceFolder}/${fileBasenameNoExtension}" ], "group": "test", "presentation": { "reveal": "always" }, "dependsOn": ["Build with Clang"] // 先执行编译任务 } 注意:这种方法不会启动调试,只是运行程序。如果用户需要调试,则必须使用调试配置(launch.json)。 总结建议: 先尝试更新扩展并使用正确的`lldb`类型配置`externalTerminal`。 若不行,再考虑使用内置终端(`integratedTerminal`)作为替代。 如果不需要调试,可以使用自定义任务来运行程序(在外部终端中)。 下面给出详细步骤: </think> ### 解决Mac系统下VSCode配置C/C++环境时`'console': 'externalTerminal'`属性不被允许的问题 当在Mac系统的VSCode中配置C/C++调试环境时,若在`launch.json`中设置`"console": "externalTerminal"`出现属性不被允许的错误,通常是由于调试器类型配置错误或扩展版本问题。以下是逐步解决方案: --- #### 步骤1:验证调试器类型(关键修复) 在`launch.json`中,**必须使用`lldb`作为调试器类型**(Mac专属),而非其他类型: ```json { "version": "0.2.0", "configurations": [ { "type": "lldb", // 必须是lldb,而非cppdbg或gdb "request": "launch", "name": "Debug C++", "program": "${workspaceFolder}/${fileBasenameNoExtension}", "console": "externalTerminal", // 现在可正常使用 "preLaunchTask": "Build with Clang" } ] } ``` - **原因**:`cppdbg`(Windows/Linux调试器)不支持`externalTerminal`属性,Mac必须用`lldb`[^1] - **验证方法**:按`Cmd+Shift+P` > "Debug: Open launch.json",选择`C++ (LLDB)`模板 --- #### 步骤2:更新C/C++扩展 1. 打开VSCode扩展面板(左侧栏第五个图标) 2. 搜索`C/C++`扩展(Microsoft官方) 3. 点击更新至**最新版本**(至少v1.18.0+) - 旧版本可能不完整支持M1芯片和`externalTerminal`属性[^3] --- #### 步骤3:检查兼容性配置 在`.vscode/c_cpp_properties.json`中添加架构声明(针对Apple Silicon芯片): ```json { "configurations": [ { "name": "Mac", "includePath": ["${workspaceFolder}/**"], "defines": [], "macFrameworkPath": [], "compilerPath": "/usr/bin/clang++", "cStandard": "c17", "cppStandard": "c++17", "intelliSenseMode": "macos-clang-arm64" // 关键:声明ARM架构 } ], "version": 4 } ``` --- #### 替代方案:改用集成终端 若仍存在问题,使用集成终端替代外部终端: ```diff // launch.json { "type": "lldb", "console": "integratedTerminal", // 替代externalTerminal ... } ``` - **优点**:无需额外配置,支持输入输出 - **激活方式**:调试时自动打开VSCode底部终端面板 --- #### 验证修复效果 1. 创建测试文件`test.cpp`: ```cpp #include <iostream> int main() { int num; std::cout << "Enter a number: "; // 测试输入输出 std::cin >> num; std::cout << "You entered: " << num; return 0; } ``` 2. 按`F5`调试: - 成功时:自动打开Terminal.app并显示输入提示 - 失败时:检查控制台错误日志(View > Output > Debug Console) > **调试提示**:若遇权限错误,终端执行`chmod +x ./your_program`赋予可执行权限[^1]。 --- ### 总结 | 问题根源 | 解决方案 | |---------------------------|------------------------------| | 调试器类型错误 (`cppdbg`) | 改用`"type": "lldb"` | | 扩展版本过旧 | 更新C/C++扩展至最新版 | | M1芯片兼容性问题 | 声明`"intelliSenseMode": "macos-clang-arm64"` | 通过上述配置,可解决`externalTerminal`属性不支持的问题。若需保留外部终端调试体验,务必确保使用`lldb`调试器[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值