GCC编译问题记录(持续补充)

GCC编译问题记录

这里记载我在使用gcc编译时,碰到的问题,方便再遇同样状况时查询,也提醒自己不要踩同样的坑。

问题1: ld: base64.o: relocation R_X86_64_32 against symbol “*” can not be used when making a shared object; recompile with -fPIC

环境:gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC) 、CentOS Linux release 7.5.1804
说明:缺少共享库编译选项
解决办法:因为编译的目标文件会用在后续链接生成共享动态库,所以,需要在编译目标文件时也要是指定-fPIC选项编译

问题2: error: unrecognized command line option ‘-std=c++14’;

环境:gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
说明:gcc版本太低
解决办法:升级到5以上

问题3: 如何在Centos7或6上安装高版本gcc

环境:CentOS Linux release 7.5.1804
说明:在Centos7上yum安装的gcc版本是4.8.*,版本太低,想换一个高版本的
解决办法:每一个Centos系统都有个名为devtoolset的开发工具集,里面的系统工具,总是保持最新状态。devtoolset-N,N系统的大版本号,N可以是{4,5,6,7…}中的任何一个,只要跟系统版本号一一对应即可。比如,Centos7,N就取值为7。对于工具的安装,首先需要启用Software Collections(即scl),Centos7执行以下步骤:

# 安装
sudo yum install centos-release-scl
sudo yum install devtoolset-7-gcc*
# 切换到scl虚拟环境
scl enable devtoolset-7 bash
# 特别重要:只有在scl的虚拟环境,编译源码时才能使用gcc高版本

问题4: 如何在Centos7或6上安装高版本clang

环境:CentOS Linux release 7.5.1804
说明:在Centos7上yum安装的clang版本是3.4.*,版本太低,想换一个高版本的
解决办法:借助devtoolset的开发工具集,Centos7执行以下步骤:

# 安装
sudo yum install devtoolset-7 llvm-toolset-7
sudo yum install llvm-toolset-7-clang-analyzer llvm-toolset-7-clang-tools-extra
# 切换到scl虚拟环境
scl enable devtoolset-7 llvm-toolset-7 bash
# 特别重要:只有在scl的虚拟环境同时启用llvm,编译源码时才能使用clang高版本

问题5: ‘boost::system::detail::generic_category_instance’或‘boost::system::detail::system_category_instance’未定义的引用

环境:gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC) 、CentOS Linux release 7.5.1804、Boost 1.68.0
说明:没有boost库中特定函数的定义
解决办法:在编译安装boost时,指定c++14或以上标准选项。执行以下boost库编译命令:

./b2 install cxxstd=14

【本章完】

<think>好的,用户现在觉得之前的回答没有完全解决他的问题,他提到使用“gb调试”可能是指GDB(GNU调试器),或者可能是一个拼写错误,比如“gpu调试”或其他工具。但根据上下文,用户是在询问内存调试的问题,所以更可能是指GDB。用户希望更详细地了解如何记录内存使用情况,具体到哪个类或文件在什么地方用了多少内存,类似调试模型。 首先,我需要确认用户的实际需求。他可能是在使用Python时遇到了内存问题,之前的建议提到了tracemalloc、objgraph、pympler等工具,但他觉得不够具体,特别是可能希望使用更底层的工具,如GDB,来进行更深入的内存分析。或者,用户可能是在其他语言环境中工作,如C/C++,需要使用GDB这样的调试工具来追踪内存使用。 接下来,我需要回顾之前的回答,看看是否有遗漏或需要补充的地方。之前的回答主要针对Python的内存调试工具,而用户现在可能想了解如何结合系统级工具,如GDB,Valgrind等,来定位内存问题。因此,需要调整回答方向,补充这些内容,尤其是如何详细追踪内存分配和具体位置。 用户提到“详细的类似调试模型”,可能希望得到一步步的具体操作指南,比如如何使用GDB的断点、内存检查命令,或者结合其他工具如Valgrind来分析内存泄漏。需要详细说明如何安装、配置这些工具,以及具体的命令和步骤,帮助用户实际应用。 同时,用户可能对Python的调试工具有所了解,但需要更底层的信息,或者需要跨语言的解决方案。因此,回答需要涵盖不同层面的工具,从应用层到系统层,解释如何在不同场景下使用这些工具来定位内存问题。 还要注意用户可能的误解,比如“gb调试”可能拼写错误,需要确认是否是GDB或其他工具,并在回答中适当提及,避免混淆。此外,用户可能希望得到更直观的输出示例,展示如何从工具的输出中识别问题所在,比如具体的代码行、类名或内存地址。 最后,确保回答结构清晰,分步骤说明,结合实例和命令,让用户能够跟随操作。同时,强调不同工具的适用场景,帮助用户根据具体情况选择合适的方法。</think>--- ### **深入定位内存问题的系统级工具与步骤** 若需要**逐行、逐对象追踪内存分配细节**(类似调试模型),可通过以下工具实现更底层的分析,明确每个类/函数的内存消耗: --- ### **一、GDB(GNU Debugger)调试内存** GDB 是系统级调试工具,适合分析C/C++扩展或Python底层内存分配(如CPython解释器),但需结合其他工具增强内存分析能力。 #### **1. 基本内存检查** - **编译时启用调试符号**(关键步骤): ```bash gcc -g -o your_program your_code.c # C/C++程序保留调试信息 ``` - **启动GDB并运行程序**: ```bash gdb --args python your_script.py # 调试Python脚本 ``` - **设置断点监控内存**: ```gdb (gdb) break malloc # 在内存分配时暂停 (gdb) break free # 在内存释放时暂停 (gdb) run # 运行程序 ``` - **查看堆栈调用**: 当程序在`malloc`处暂停时,使用`bt`命令查看调用栈,定位触发内存分配的代码位置: ```gdb (gdb) bt #0 malloc (size=1024) #1 0x00007ffff7e1a2d3 in YourClass::allocateBuffer() at your_code.cpp:42 ``` #### **2. 结合Valgrind(内存泄漏检测)** Valgrind 是更强大的内存分析工具,可检测未释放内存、越界访问等问题。 - **安装与运行**: ```bash sudo apt-get install valgrind # Ubuntu/Debian valgrind --leak-check=full --track-origins=yes python your_script.py ``` - **输出关键信息**: ``` ==12345== 1,024 bytes in 1 blocks are definitely lost in loss record 1 of 10 ==12345== by 0x4A06F2E: YourClass::init() (your_code.cpp:42) ==12345== by 0x400ABC: main (main.cpp:30) ``` - **解读**:`your_code.cpp`第42行的`YourClass::init()`函数未释放`1024`字节内存。 --- ### **二、Python专用工具:详细内存快照与对象追踪** 若需在Python中实现类似“逐行调试”的内存监控,需组合以下工具: #### **1. `memory_profiler`(逐行内存分析)** - **安装**: ```bash pip install memory_profiler ``` - **标记目标函数**: ```python from memory_profiler import profile @profile(precision=4) # 记录内存变化,精度为4位小数 def your_function(): # 目标代码 ``` - **运行并输出**: ```bash python -m memory_profiler your_script.py ``` - **结果示例**: ``` Line # Mem usage Increment Occurrences Line Contents ============================================================= 42 16.3125 MiB 16.3125 MiB 1 data = [np.zeros(1000) for _ in range(1000)] 43 24.7500 MiB 8.4375 MiB 1 processor = DataProcessor(data) ``` - **解读**:第42行创建列表消耗`16.31 MiB`,第43行创建`DataProcessor`实例再增加`8.44 MiB`。 #### **2. `guppy3`(堆内存对象统计)** - **安装**: ```bash pip install guppy3 ``` - **实时查看对象分布**: ```python from guppy import hpy hp = hpy() print(hp.heap()) # 输出当前堆内存中对象统计 ``` - **输出示例**: ``` Partition of a set of 123456 objects. Total size = 45.67 MB Index Count % Size % Cumulative % Kind (class / dict of class) 0 50000 40 20.00 MB 44 20.00 MB 44 list 1 30000 24 12.00 MB 26 32.00 MB 70 YourClass ``` - **解读**:`YourClass`实例占用`12 MB`,占总内存26%。 --- ### **三、实战案例:定位类方法的内存泄漏** #### **场景**:`DataProcessor.process()`方法每次调用增加内存占用。 1. **使用`memory_profiler`标记方法**: ```python class DataProcessor: @profile def process(self, data): self.cache = data # 可疑点:缓存数据未释放 # ...其他操作... ``` 2. **运行分析**: ```bash python -m memory_profiler your_script.py ``` 3. **输出定位**: ``` Line # Mem usage Increment Occurrences Line Contents ============================================================= 15 50.0 MiB 50.0 MiB 1 self.cache = data ``` - **结论**:`self.cache`持续积累数据未清理,应改为定期重置或弱引用。 --- ### **四、系统级内存监控(Linux/MacOS)** #### **1. `pmap`查看进程内存映射** ```bash pmap -x <PID> | grep -i heap # 查看进程的堆内存占用 ``` - **输出**: ``` Address Kbytes RSS Dirty Mode Mapping 00007f8d3c000000 102400 102400 102400 rw--- [heap] ``` - **解读**:进程堆内存占用`102400 KB`(约100 MB)。 #### **2. `heaptrack`(可视化内存分配器)** - **安装**: ```bash sudo apt-get install heaptrack # Ubuntu brew install heaptrack # MacOS ``` - **运行并生成报告**: ```bash heaptrack python your_script.py ``` - **分析结果**: - 生成`heaptrack.your_script.PID.gz`文件,用`heaptrack_gui`打开后可交互式查看: - **按调用树排序**:定位分配内存最多的函数调用链。 - **按分配位置排序**:直接显示源码文件及行号。 --- ### **五、关键策略总结** | 需求 | 工具 | 输出细节 | |--------------------------|-----------------------|-----------------------------------------| | 逐行内存变化 | `memory_profiler` | 每行代码的内存增量 | | 对象级内存分布 | `guppy3` | 按类/类型统计对象数量和内存大小 | | 底层内存分配追踪 | GDB + Valgrind | C/C++扩展的内存泄漏位置(文件+行号) | | 可视化内存消耗热点 | `heaptrack` | 交互式图表展示分配路径和累积消耗 | --- ### **六、调试流程建议** 1. **缩小范围**:先通过`memory_profiler`或`tracemalloc`定位到可疑函数/模块。 2. **深入分析**:在目标代码段使用`guppy3`或`heaptrack`查看对象详情。 3. **系统验证**:若涉及C/C++代码,用GDB+Valgrind检查底层泄漏。 通过上述组合工具,可精确到“**某一行代码、某个类实例**”的内存消耗,实现类似单步调试的内存监控效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值