cpp编译调试bug
spdlog使用
spdlog是一个很好用的日志库,用来调试很方便,下面是一个简易用法
#include "spdlog/sinks/basic_file_sink.h"
#ifndef NDEBUG
// 创建logger(输出到文件basic-log.txt)
auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic-log.txt");
logger->info("logger start!");
// flush会将缓冲区的内容刷入文件中(可能影响性能)
logger->flush()
#endif
valgrind使用
valgrind是一个很好用的检测内存泄漏的工具,有很多用法。下面介绍如何安装valgrind以及如何使用
# valgrind install
wget https://sourceware.org/pub/valgrind/valgrind-3.23.0.tar.bz2
bzip2 -d valgrind-3.23.0.tar.bz2
tar -xf valgrind-3.23.0.tar
cd valgrind-3.23.0
./configure && make
make install
# valgrind use
valgrind --tool=memcheck --leak-check=full ${program}
memcpy和char *
这是一个很细节的bug,当我们使用memcpy拷贝字符串内容到char *时,memcpy不会自动在char *末尾补\0。因此直接使用这个拷贝后的字符串可能会出现一些很神奇的bug,比如发现末尾多了几个乱码字符。。。这种情况我们需要额外使用一个size参数限定这个字符串的长度。
char *dest = "1234567890" ;
size_t size = 7 ;
char *src ;
memcpy(src, dest, size);
// 直接使用src可能会出问题,使用size限定其长度
auto src_str = std::string(src, size);
gdb调试bug
Dwarf Error: wrong version in compilation
Dwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4) no debugging symbols found
这个bug原因是gdb识别到了不兼容的Dwarf版本,导致找不到调试信息。这种情况是因为gcc版本相较于gdb版本太高,解决方法是,升级gdb版本到8.0以上(支持Drawf 5),或者在gcc编译时加入-gdwarf=4
让其生成dwarf=4的调试信息