1.lldb 小记和std::string的设置数据结构【】【源码阅读】
2.编译技术入门与实践之LLVM概述及环境构建
3.通过 JetBrains Rider 或 Visual Studio 对虚幻引擎项目进行断点调试
4.system.getproperty('java.class.path')是在什么时候被设
5.LLVM开发环境搭建-VSCode远程版本
lldb 小记和std::string的数据结构【】【源码阅读】
在深入理解LLVM和GCC的std::string实现差异时,我们首先从lldb着手,源码探索其内部工作机制。常用昨天尝试编译llvm后,调试今天我们就来研究std::string在lldb中的命令表现,它与g++的设置linux nfs 源码剖析std::string实现有何不同。
从一个简单的源码测试程序开始,我们对比了用g++和clang++编译的常用代码。在g++版本中,调试字符串s使用了短字符串优化(SSO)的命令存储方式,"hi"存储在_M_local_buf中。设置SSO旨在节省内存,源码通过为短字符串预留固定大小的常用结构,如长度、调试容量和指向字符串数组的命令指针,共字节。
对于长字符串,lib文件源码查看例如scow,存储方式不同。尽管_M_local_buf中没有"this is a sunny day",但通过M p找到的实际字符串地址显示出长字符串的存储策略。这表明在长字符串时,std::string会采用常规的存储方式,即一个指针指向字符串数组。
接下来,我们需要弄清楚如何判断何时使用SSO。在代码中,我们猜测可能通过某些标志位来区分,但实际观察到的operator[]函数表明,M p始终指向字符串数组,不论字符串长度。这就意味着,无论短长,api如何查看源码读取指定位置的字符都遵循相同的逻辑。
在libstdc++(g++)和libc++(llvm)的实现上,我们发现两者在数据结构上存在差异。例如,libstdc++的std::string使用字节的union,而libc++则为字节。区分长短字符串的方式在libc++中通过检查容量字段的比特位实现,这依赖于机器的字节序。
附录中,我分享了自己编译LLVM的体验和使用clang++编译程序的CMakeLists.txt设置,供有兴趣的读者参考。
编译技术入门与实践之LLVM概述及环境构建
LLVM入门与实践:概述与环境搭建
本系列旨在记录学习过程,便于知识整理和交流。作为一名专注于智能芯片研究的工程师,编译器设计是常遇课题,最近的炒币吧源码实验涉及LLVM pass,处理源代码到数据流的转换。
LLVM是一个广泛应用于编译器和工具链的开源项目,它以SSA(静态单一赋值)为基础,支持多种语言的编译。该项目由伊利诺大学发起,包含核心库、编译器、调试器等组件,以通用性、灵活性和可重用性为特点。LLVM的核心子项目包括LLVM Core(优化器和代码生成器)、Clang(C/C++编译器)、LLDB(调试器)等,每个子项目都服务于特定的编译任务和性能优化。
要进行LLVM pass实验,首先需要获取LLVM源代码。视频制作app源码推荐的命令和依赖环境设置需确保对应支持的硬件平台和软件库,包括CMake、gcc、Python等。在Ubuntu系统上,可能需要特别关注OpenSSL的安装,并可能需要升级CMake。通过Docker环境如Chipyard进行实验是一个不错的选择,环境检查和配置构建的过程也需遵循官方文档指导。
构建LLVM和Clang时,可以使用CMake或make工具,根据需要选择并行构建或顺序构建。在遇到编译错误时,官方文档和论坛提供了相关帮助资源。完成环境配置和编译后,LLVM的工具和库将被安装到指定位置,便于后续的开发和实验。
通过 JetBrains Rider 或 Visual Studio 对虚幻引擎项目进行断点调试
调试虚幻引擎项目时,你可以使用 JetBrains Rider 或 Visual Studio。首先,确保已正常打包 Windows 版本项目,无需特殊处理。
为了进行附加调试,创建一个工程启动快捷方式时,在参数部分添加 "-waitforattach",记得留有空格。接下来,根据IDE选择相应的附加方式:
使用 Rider,找到ID较大的进程,然后在调试选项中选择 LLDB。确保右下角勾选 "Attach with LLDB"。
而在 Visual Studio 中,应选择ID较小的进程,并选择与之相匹配的调试模式。
设置好附加后,你可以开始设置断点,按照需要逐步调试。然而,可能会遇到QA堆栈显示不正确的情况。这通常是由于源代码和符号文件不匹配导致的。如果是本地工程在本地机器上运行,这个问题通常不会出现。但如果涉及到非本地程序,确保源代码路径已配置在符号路径中,以确保正确的符号映射。
system.getproperty('java.class.path')是在什么时候被设
系统属性java.class.path的设置确实隐藏且复杂,我通过lldb调试工具找到其被加入SystemProperty的源头。我使用的是OpenJDK 9源代码进行调试,具体定位在了以下地址:github.com/dmlloyd/open...
在该源代码中,java.class.path属性值被成功加入到系统属性链表。详情请参考上述链接,深入理解其设置过程。
LLVM开发环境搭建-VSCode远程版本
LLVM开发环境在VSCode中搭建的远程版本
在本文中,我们将指导您在macOS .4系统上使用VSCode 1..1版本,配合远程Ubuntu ..2 LTS系统,以及LLVM .0.6版本,搭建一个支持远程连接的开发环境。以下是具体步骤:步骤1:环境配置
确保VSCode已安装并更新到最新版本。对于远程系统,需要准备SSH连接信息,包括IP地址、用户名和可能的非默认端口号。步骤2:LLVM源码获取与依赖
首先,从相关文章获取源码和必要的编译依赖。步骤3:VSCode配置
在VSCode中,打开用户设置文件,配置远程SSH连接,如图所示,需要填写Host、HostName、User等参数。步骤4:导入LLVM项目
通过VSCode的"打开"功能,选择远程机器上的LLVM项目(默认为llvm-project),进行导入。步骤5:源码编译
在llvm-project目录下创建build文件夹,使用CMake进行编译。然后在tasks.json中配置合适的构建任务。步骤6:调试配置
创建launch.json文件,配置调试设置,如断点和lldb的使用。例如,为RISCV后端设置断点。步骤7:调试过程
启动调试,首次编译可能耗时,但随后会在设置的入口处停止,继续执行则会在断点处暂停。 总结,通过这些步骤,您已经在本地VSCode上成功搭建了支持远程调试的LLVM开发环境。只需略过与远程相关的部分,该方法同样适用于本地开发。