GDB, CPP

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的调试信息