一次C++调试记录
- 到ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/网站上选择支持c++17的gcc版本,并使用wget下载到Linux系统中:wget ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.bz2
- 安装编译gcc需要的依赖包 sudo yum install gmp-devel mpfr-devel libmpc-devel -y
- 解压gcc压缩包到temp文件夹 tar -jxf gcc-7.1.0.tar.bz2 -C temp
- 进入到temp/gcc目录下,执行 gcc ./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib && make 进行gcc的编译(这个步骤耗时较长)
- 安装新版gcc sudo make install
- 由于在./configure阶段未指定安装路径,那么新版的gcc的默认安装位置就是/usr/local/目录下,修改标准库的软连接使其指向新版本的标准库 sudo ln -sf /usr/local/lib64/libstdc++.so.6.0.23 /lib64/libstdc++.so.6
- 需要使用c++17的特性时,需要在Makefile的CXXFLAGS变量中添加 -std=c++17
- 检查gdb版本 gdb --version, (如果版本号低于7.0就不用往下看了)
- 在当前用户的home目录中(如/home/sxhlinux)下载 插件代码 svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python (没有svn的,需要通过 sudo yum install svn -y 安装)然后执行mv python .gdb_stl 将该文件夹重命名(使其隐藏)
- 执行 vim ~/.gdbinit,编辑gdb配置文件,添加如下内容
add-auto-load-safe-path /usr/local/lib64/libstdc++.so.6.0.23-gdb.py #文件的版本号,根据这个目录中的实际文件版本号确定 python
import sys
sys.path.append("/usr/local/share/gcc-7.1.0/python")
sys.path.insert(0, '/home/sxhlinux/.gdb_stl') #注:将第二个参数中的路径改成自己的.gdb_stl文件夹路径
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
- 下面的代码是将带有数字特征的分词(用unorder_map保存),按照一定的规则(分词的数字特征)进行合并
#include <iostream>
#include <cstdlib>
#include <map>
#include <unordered_map> using namespace std; template <typename T1, typename T2>
bool merge_tokens(T1 &target, const T2 &rules)
{
auto pre = target.begin();
for (auto token = target.begin(); token != target.end(); ) {
if (pre == token) {
token ++;
continue;
} auto range = rules.equal_range(pre->second);
auto it = range.first;
for (; it != range.second; it++) {
if (it->second == token->second) {
break;
}
} if (it == range.second) {
pre = token;
token ++;
}
else {
pre->first += token->first;
// target.insert(std::make_pair<typename T1::key_type, typename T1::mapped_type>(pre->first + token->first, 16));
pre->second = 16;
token = target.erase(token);
pre = token;
}
}
} int main ( int argc, char *argv[] )
{
unordered_map<string, size_t> tokens = {{"def", 22}, {"ghi", 100}, {"abc", 22}};
unordered_multimap<size_t, size_t> rules = {{22, 100}, {100, 22}, {1, 38}};
merge_tokens(tokens, rules); return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
- 编译该文件,提示 31行
test.cpp:31:15: error: passing ‘const std::__cxx11::basic_string<char>’ as ‘this’ argument discards qualifiers [-fpermissive]
pre->first += token->first;
~~~~~~~~~~~^~~~~~~~~~~~~~ /usr/local/include/c++/7.1.0/bits/basic_string.h:1122:7: note: in call to ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator+=(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
operator+=(const basic_string& __str)
^~~~~~~~
- 将报错的这一行注释掉,然后用gdb查看下pre->first和token->first的具体类型。具体如下
(gdb) whatis target
type = std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long> &
(gdb) whatis target.begin()
type = std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> > >::iterator
(gdb) whatis pre
type = std::__detail::_Node_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long>, false, true>
- 根据第三步的分析结果,要实现合并元素的效果,只能是将合并后的值作为一个新的pair插入到原来的map中,然后将原来的两个pair删除。代码如下:
target.insert(std::make_pair<typename T1::key_type, typename T1::mapped_type>(pre->first + token->first, 16));
target.erase(pre);
token = target.erase(token);
pre = token;
一次C++调试记录的更多相关文章
- SPI 核软件调试记录
SPI 核软件调试记录 1.首先说说int SpiFlashWaitForFlashReady(void)这一函数,基本上其它函数在执行的时候,都会事先执行一次此函数. 因为此函数的作用主要是用 ...
- Video Timing Controller v6.1软件调试记录
Video Timing Controller v6.1软件调试记录 GUI配置: . case XVTC_VMODE_PAL: //576i@50 { TimingPtr->Interlace ...
- Video Test Pattern Generator(7.0)软件调试记录
Video Test Pattern Generator(7.0)软件调试记录 . XVidC_VideoMode XVIDC_VM_576_50_I = XVIDC_VM_720x576_50_I ...
- MA82G5D16AS16 主频调试记录
MA82G5D16AS16 主频调试记录 当 SCKS 设置 为 MCKDO / 128 时 MCU 的电流为 0.58mA,100UF 电容可以维持 0.5S,大概可以满足. 但是需要注意外围的线路 ...
- Apusic中间件结合MyEclipse进行远程调试记录
Apusic中间件结合MyEclipse进行远程调试记录. 在金蝶域中正常部署应用. 启动金蝶中间件时使用"startapusic -ds"命令. 在MyEclipse的Run-- ...
- http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天
http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天
- 基于freescale i.Mx6(ARM)的阿里云oss调试记录
交叉编译阿里OSS调试记录 1.1 开通oss服务 具体参考以下链接: https://help.aliyun.com/document_detail/31884.html?spm=a2c4g.111 ...
- [ZJCTF 2019]EasyHeap | house of spirit 调试记录
BUUCTF 上的题目,由于部分环境没有复现,解法是非期望的 house of spirit 第一次接触伪造堆的利用方式,exp 用的是 Pwnki 师傅的,本文为调试记录及心得体会. 逆向分析的过程 ...
- [未完] Linux 4.4 USB —— spiflash模拟usb大容量存储设备 调试记录 Gadget Mass Stroage
linux 4.4 USB Gadget Mass Stroage 硬件平台: licheepi nano衍生 调试记录 驱动信息 │ This driver is a replacement for ...
- 【原】xcode5&IOS7及以下版本免证书真机调试记录
搞了有一段IOS开发了,之前一直在企业做,近阶段主要在公司做C++服务端开发,打算在空闲实现搞搞个人开发,为自己赚钱,IDP还没申请下来,所以先用此方法在越狱设备上先做一下app的免证书真机调试,先记 ...
随机推荐
- html学习笔记 - 标签
单标签 : <!DOCTYPE html> 解析类型标签 <!-- xxx --> 注释标签 <br /> 换行标签 <hr /> 分割线标签 < ...
- Lua学习(4)——函数
在Lua中函数的调用方式和C语言基本相同,如:print("Hello World")和a = add(x, y).唯一的差别是,如果函数只有一个参数,并且该参数的类型为字符串常量 ...
- Html_Task4(知识点:水平居中+垂直居中/position/float/border-radius)
任务四:定位和居中问题 任务目标 实践HTML/CSS布局方式 深入了解position等CSS属性 任务描述 实现如 示例图(点击打开) 的效果 灰色元素水平垂直居中,有两个四分之一圆位于其左上角和 ...
- AjaxPro.AjaxMethod 简单应用,
用AjaxPro无刷新实现站内信息实时提示功能,用AjaxPro.2.dll实现表数据绑定和无刷新分页 首先,必不可少的就是dll-----AjaxPro.2 下载地址:http://down7.pc ...
- neutron flat和vxlan网络访问外网流量走向
OpenStack版本:Mitaka 物理节点: Hostname Management IP Tunnel IP Role test-ctrl-01 192.168.100.11 192.168.1 ...
- 简单VR照片 使用陀螺仪、姿态角(Roll、Pitch、Yaw )、四元数
最近在做一个类似VR照片的demo,跟全景图片也很像,只是VR照片与全景720度显示,我只做了180度.但我发现他们实现的原理有一丝相似,希望可以给一些想入行AR.VR的朋友一些提示吧. ...
- OpenGL教程(0)——介绍
OpenGL介绍 OpenGL,全称Open Graphics Library,是一个用C语言写的图形API.通俗地说,OpenGL用来绘制2D/3D图形.目前OpenGL的运用十分广泛,有许多用Op ...
- D. 实验室传染病
D. 实验室传染病 题意 给出 n 个人的位置,以及每个人的传染范围,当一个人患病时,他的传染范围内(包括边界上)的人全部会被感染并继续向外传播. 求以每个人为传染源最多有多少人被感染. 分析 首先二 ...
- Caffe代码分析--crop_layer.cu
因为要修改Caffe crop layer GPU部分的代码,现将自己对这部分GPU代码的理解总结一下,请大家多多指教! crop layer完成的功能(以matlab的方式表示):A(N,C,H,W ...
- python3 简单实现从csv文件中读取内容,并对内容进行分类统计
新手python刚刚上路,在实际工作中遇到如题所示的问题,尝试使用python3简单实现如下,欢迎高手前来优化import csv #打开文件,用with打开可以不用去特意关闭file了,python ...