Bug调试1.0

目录

自定义错误码枚举体

man手册的查询范围

[为什么 man Json::Reader::parse 找不到?](#为什么 man Json::Reader::parse 找不到?)

非静态成员引用必须与特定对象相对

两个头文件相互包含?

服务端Listen()段错误

🐉龙级dubug野指针错误

为什么不会崩溃?为什么在41的Listen()才报错?为什么在写入野指针的时候不会报错?VS2022?

回顾需函数调用机制

gdb查函数栈帧

Linux与WIn地址对比

[📊 Linux vs Windows 地址对比](#📊 Linux vs Windows 地址对比)

[recv()及一系列的void* buf参数](#recv()及一系列的void* buf参数)

头文件循环包含问题

错误码尽量打印


pthread_create()调用内部类函数虽参数、返回值符合格式但因:"域名访问限制,导致参数类型不符"。

解决办法:加static,去除域限定作用。

增:类内访问"域作用限定",必不可少!!

自定义错误码枚举体

man手册的查询范围

css 复制代码
w@instance-qhw6x01g:~CustomizeProtocol/$ man Json::Reader::parse
No manual entry for Json::Reader::parse

1.Linux系统调用。

2.C库函数。

3.系统管理命令。(像rm cd touch)

为什么 man Json::Reader::parse 找不到?

命令 查找范围 是否支持 C++ 类
man 系统手册(Section 1-8) ❌ 不支持(只有 C 函数)
man 3 printf C 标准库 ❌ 不支持 C++ 类
man std::string C++ 标准库 ❌ 大部分发行版不支持

非静态成员引用必须与特定对象相对

std::string::substr (0, pos)

原因:必须使用相应的实例对象来调用接口。不能匿名调用

两个头文件相互包含?

当代码量激增、文件数激增。一定要注意头文件相互包含的情况。

Protocol.hpp

cpp 复制代码
#pragma once
#include"../Package/Log.hpp"
#include<jsoncpp/json/json.h>
#include"Socket.hpp"
#include"../Package/Comn.hpp"
#include"Calculate.hpp"
#include<functional>

Calculate.hpp

cpp 复制代码
#pragma once
#include<string>
#include"Protocol.hpp"

服务端Listen()段错误

esc切到上窗口:"Space"打断点

i切到gdb窗口

两个参数 "r 8081"

s进入函数执行,n不进入

报错:

css 复制代码
(gdb) n
[2026-08-20 10:33:23] [INFO] [41339] [Socket.hpp] [40] - Bind完成

Program received signal SIGSEGV, Segmentation fault.
0x000055555555973e in SocketClass::TCPServerBuild (this=0x555555575ef0) 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查函数栈帧

bash 复制代码
info address TCPSocket::Listen()

Linux与WIn地址对比

📊 Linux vs Windows 地址对比

特性 Linux (64位) Windows (64位)
地址范围 0x555555555xxx0x7fffxxxx 0x00007ff7xxxx0x000001xxxx
典型堆地址 0x555555xxxxxx 0x000001xxxx
典型栈地址 0x7fffxxxxxxxx 0x000000xxxxx
典型大小 48 位有效地址 44-48 位有效地址

recv()及一系列的void* buf参数

void* buf参数指的是可以被按照字节流式填充的字段,因此就直接限定了纯粹数组。*string不行,因为其内部封装以指针、容量等。

头文件循环包含问题

解决此问题的基础知识:

1.类内成员函数编译时机------C++规定:类内成员函数体的编译时机是在该类的"};"之后进行的。(方便了类内函数体实现时机的灵活性)

2.头文件展开的性质:头文件是依次展开,我们可以假设哪个头文件先展开而后逐渐推理出完整链条。(而非并发什么的)

解决方法

1.方法解耦:即所用到的那个模块可不可以用无耦合文件内部实现。

2.前置声明(局限性):先让编译器认识"这是一个类的名字"。禁止做内部解析。

错误码尽量打印

cpp 复制代码
fprintf(stderr, "fail: %s (errno=%d, ret=%d)\n", \
            strerror(errno), errno, ret);
相关推荐
T01156181 天前
艺培场馆课时预约小程序用户端 & 后台联动踩坑上篇(预约、课时、缓存、消息、学员端自身问题)
java·缓存·小程序·bug·全栈项目实战手记·艺培课时系统‘’
zone_z1 天前
07 · 等待事件与 OWI 方法:从 OSW 到 BUG 的完整破案实录
linux·数据库·oracle·ffmpeg·bug·troubleshooting
黑猫学长呀2 天前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
姚青&3 天前
测试流程搭建
测试用例·bug·jira
mmsx3 天前
return false 不是拦截:一次按键触发两个动作的事件冒泡陷阱
android·bug
随风丶飘4 天前
[特殊字符] 告别“update“和“fix bug“——Smart Git Commit LLM 让 AI 帮你写专业的 Git 提交信息
人工智能·git·bug
czhc11400756634 天前
崩溃复查与“回声“bug:异常码判案、漏网之鱼和耳塞开关
bug
mmsx5 天前
我明明调用了 zoomToBounds,地图却总是停在别处?延迟加到 5 秒也没用,真相只有一个
android·人工智能·bug·地图
mmsx5 天前
置灰按钮为什么自己又“亮“了?一次状态缓存“双写冲突“的排查记录
java·缓存·bug·livedata