ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

日常积累Bug调试1.0

2026/8/26 17:54:41 拓冰建站 浏览量
日常积累Bug调试1.0 目录自定义错误码枚举体man手册的查询范围为什么 man Json::Reader::parse 找不到非静态成员引用必须与特定对象相对两个头文件相互包含服务端Listen()段错误龙级dubug野指针错误为什么不会崩溃为什么在41的Listen()才报错为什么在写入野指针的时候不会报错VS2022?回顾需函数调用机制gdb查函数栈帧Linux与WIn地址对比 Linux vs Windows 地址对比recv()及一系列的void* buf参数头文件循环包含问题错误码尽量打印pthread_create()调用内部类函数虽参数、返回值符合格式但因“域名访问限制导致参数类型不符”。解决办法加static去除域限定作用。增类内访问“域作用限定”必不可少自定义错误码枚举体man手册的查询范围winstance-qhw6x01g:~CustomizeProtocol/$ man Json::Reader::parse No manual entry for Json::Reader::parse1.Linux系统调用。2.C库函数。3.系统管理命令。像rm cd touch为什么man Json::Reader::parse找不到命令查找范围是否支持 C 类man系统手册Section 1-8❌ 不支持只有 C 函数man 3 printfC 标准库❌ 不支持 C 类man std::stringC 标准库❌ 大部分发行版不支持非静态成员引用必须与特定对象相对std::string::substr (0, pos)原因必须使用相应的实例对象来调用接口。不能匿名调用两个头文件相互包含当代码量激增、文件数激增。一定要注意头文件相互包含的情况。Protocol.hpp#pragma once #include../Package/Log.hpp #includejsoncpp/json/json.h #includeSocket.hpp #include../Package/Comn.hpp #includeCalculate.hpp #includefunctionalCalculate.hpp#pragma once #includestring #includeProtocol.hpp服务端Listen()段错误esc切到上窗口“Space”打断点i切到gdb窗口两个参数 “r 8081”s进入函数执行n不进入报错(gdb) n [2026-08-20 10:33:23] [INFO] [41339] [Socket.hpp] [40] - Bind完成 Program received signal SIGSEGV, Segmentation fault. 0x000055555555973e in SocketClass::TCPServerBuild (this0x555555575ef0) at /home/w/e2026/Auguest/CustomizeProtocol/SocketCom/Socket. hpp:41 41 Listen ();龙级dubug野指针错误查了一晚上1h症状问题出现在Listen()的调用上调用不过去。就出现段错误的提示1.检测继承、定义、声明问题。2.检测拼写问题。3.进入Socket()、Bind()主要查看_sockfd的定义问题。4.求助AI反思debug路径错误指针使用习惯不好未及时初始化。InetAddr中未对成员char* _port; 及时初始化导致野指针访问。为什么报错位置偏移知识补充野指针访问不应该直接报错吗这是标准的野指针格式 x*VUUU 。为什么这么大即使是正常指针这是因为Linux系统的原因strcpy执行后“这是野指针赋值”为什么不会崩溃为什么在41的Listen()才报错为什么在写入野指针的时候不会报错VS2022?这是因为Linux下区别于Win的Dubug它继续运行是栈的继续使用(如上次的指针废弃后的复用)无法识别野指针回顾需函数调用机制执行Listen前在执行① 时就已经报错了gdb查函数栈帧info address TCPSocket::Listen()Linux与WIn地址对比Linux vs Windows 地址对比特性Linux (64位)Windows (64位)地址范围0x555555555xxx或0x7fffxxxx0x00007ff7xxxx或0x000001xxxx典型堆地址0x555555xxxxxx0x000001xxxx典型栈地址0x7fffxxxxxxxx0x000000xxxxx典型大小48 位有效地址44-48 位有效地址recv()及一系列的void* buf参数void* buf参数指的是可以被按照字节流式填充的字段因此就直接限定了纯粹数组。*string不行因为其内部封装以指针、容量等。头文件循环包含问题解决此问题的基础知识1.类内成员函数编译时机——C规定类内成员函数体的编译时机是在该类的“};”之后进行的。方便了类内函数体实现时机的灵活性2.头文件展开的性质头文件是依次展开我们可以假设哪个头文件先展开而后逐渐推理出完整链条。而非并发什么的解决方法1.方法解耦即所用到的那个模块可不可以用无耦合文件内部实现。2.前置声明(局限性)先让编译器认识“这是一个类的名字”。禁止做内部解析。错误码尽量打印fprintf(stderr, fail: %s (errno%d, ret%d)\n, \ strerror(errno), errno, ret);