惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
Microsoft Security Blog
Microsoft Security Blog
宝玉的分享
宝玉的分享
小众软件
小众软件
雷峰网
雷峰网
F
Full Disclosure
B
Blog
Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
月光博客
月光博客
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
TaoSecurity Blog
TaoSecurity Blog
博客园 - 聂微东
P
Palo Alto Networks Blog
N
Netflix TechBlog - Medium
S
Secure Thoughts
Google Online Security Blog
Google Online Security Blog
P
Privacy & Cybersecurity Law Blog
U
Unit 42
Cloudbric
Cloudbric
Know Your Adversary
Know Your Adversary
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Vercel News
Vercel News
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
T
Tailwind CSS Blog
S
Schneier on Security
IT之家
IT之家
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tenable Blog
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
T
Troy Hunt's Blog
V2EX - 技术
V2EX - 技术
Cyberwarzone
Cyberwarzone
P
Privacy International News Feed
I
InfoQ
MongoDB | Blog
MongoDB | Blog
Project Zero
Project Zero
B
Blog RSS Feed
Help Net Security
Help Net Security
H
Heimdal Security Blog
有赞技术团队
有赞技术团队
The Register - Security
The Register - Security
V
V2EX
C
CXSECURITY Database RSS Feed - CXSecurity.com
J
Java Code Geeks

LINUX DO - 最新话题

谷歌云盘下载700g数据集,求方法 OpenAI推出了100美元的Pro订阅后,plus的Codex 5小时限额大幅缩水 之前买的super grok居然还没掉 关于CPA认证文件周限 佬们,默认CDK的要求是什么等级啊? 最新版本的微信群聊机器人方案 有没有人知道如何free号没有封,那么是否可以循环使用,因为我看主要是周限 L站改版了?吓我一跳,我以为我浏览器崩了 淘宝这种宽带可信吗,500兆移动宽带月费8元到2099年 docker内部应用访问宿主机mysql和redis时被拒绝connection refuse Erp全栈想转行做Ai有什么推荐的吗 boost有bug 佬们,有没有靠谱点的 Plus 购买渠道 大妈,狗妈用的 lg 服务有源头开源项目吗? 有人有能过验证码打码的嘛 上次帖里好像发过通过大模型来打码的 gpt plus 封号似乎也太快了点,一天就给封号了 按流量/token收费的国产官方AI推荐 我算是知道了为什么Oracle总是ABC了 佬友们帮我分析一下 ChatGPT Team账号只有一个人使用和4个席位邀请满了使用的总额度是一样的吗? gpt-free 10个带rt CPA反代claude是默认1m吗? 我终于敢说我做出来windows上tmux的替代了,目标windows/全平台最强的终端Ai编程工具 claude pro升级max,除了原来的$20,好像还能再领一次$100 关于AI agent的知识框架 独乐乐不如众乐乐,分享一下我的的AI对话程序 佬们自建网站支付问题是怎么解决的 怎么能让gpt模仿claude风格输出 codex free已经死了,下一个会是plus或者team吗 请问chatgpt pro里的fast模式,速度快了,降智吗 天才程序员想要复活,还有可用的codex公益站么 里斯本丸沉没照进现代了 [富可敌国] [一叶知秋API]友仔们 我们换域名了~~ 记得更新一下哦 有点莫名其妙,被阿里云警告了 从道观回家之前,我和师兄问道 【picpi 皮皮公益站】为了防止有人拿去卖,邀请码发放规则更新。 美国 FAA: 我们需要你,游戏玩家,来当空管吧 vibe时用文言省tok吗? 有没有用? 会降表现吗? Codex CLI 官方这个 imagegen 的 Skill 到底是干啥的?哪有对应工具啊? 求问关于尼区和美区开通Claude 换设备登录telegram国内号码老账号 需要收费咋办? 发现hotmail的额度特别耐用 最近还有能正常用的claude中转站吗? 避雷闲鱼上面的CC中转站 现在cursor的优势是什么呢? OpenAI 回应马斯克要求罢免奥尔特曼:搞法律突袭,扰乱诉讼 谁在吹opencode go套餐啊,又慢量又少 【SamAltman】奥特曼被燃烧瓶袭击后的回应 咸鱼上359买的claude MAX 5x ,美国假家宽,看看能活几天 想问问跳蚤市场开的Pro和Plus 虚拟卡链接求助 [开源插件] 做了一个适合科研佬的GPT插件 【AI小说】拿AI跑了一部小说,佬们看看质量怎么样 总是能在首页看到opus4.6鞭尸推送 这个别名邮箱可以注册gpt 一个人在外地的话,佬们周末都做什么 你们ddg还能行不 获取不到新的邮箱 了····· claude code修复codex windows升级0.120.0 无法打开问题 我现在Zeabur上搭建了CPA服务,怎么再接入new api来做分发 杭州有么有佬友在搞AI应用这块的,四年前端转AI开发 汇丰、渣打两家银行获得香港稳定币牌照 【开源推广】 AIUsage:聚合多个 AI 平台配额与用量的 高颜值 macOS端 CPA看板 APP Newapi吃服务器内存多吗 中行跨境通疑限制无卡连续交易 或为应对盗刷 突然不能用表情回应话题了 codex是不是降额度了 反馈关于 “快问快答”标签的乱象 opencode版本1.4.3 无法上传图片问题 想问一下怎么解决这个问题,就是终端太多? codex更新到0.120.0之后无法加载以前的会话 sub2api怎么部署? 分享一个自用的南京继续教育平台视频自动播放下一集的油猴脚本 zotero9出来了 Claude正在向我推销付费项目,那能让你轻易得逞嘛 甲骨文用脚本开出来4个2+12咋办啊佬们,我还是免费号 各个厂的coding plan lite都绝版了? claude code 20美金账户问题 联通元景套餐续费问题 ai时代下的一些思考(诚邀大家讨论) 出境易GPT订阅pro求助 今年到目前股市的操作。 刚收到短信之前跑路的那家可以兑换了 佬们都用境外服务器做什么呢? 甲骨文4+24 求助领pro时候报错-付款页面出错。请重试。如果问题依然存在,请访问help.openai.com。 cloudflare 浏览器渲染增加了 CDP与mcp支持 SUB2API 导入 rt 时报错显示 Request failed with status code 502 如何解决 讨论一下怎么整理笔记 codex0.120.0更新后无法启动,回退 0.119.0正常使用 冰佬的公益站也不行了吗 三角洲直接给我封了10年 有佬友知道怎么起诉么 88VIP邀请 经过排查大概确定反重力代理报错问题了 【求助】openrouter 今年4月用国内visa卡充值后导致封禁,无法使用外国模型 奥特曼家被炸 自用,高信息量回复收集 求助sub2api分组问题 【新人报道】注册成功了 分享100个codex free账号 招聘 深圳客户端开发(flutter) 20k+
小白学Epoll网络编程3 在linux下调试程序
kisaragi (kisaragi) · 2026-06-07 · via LINUX DO - 最新话题

经历了1和2后我们现在已经有了能够运行的代码,那么如何在linux上使用gdb调试他呢?不能一直用print然后看输出来调试吧, 我们要有单步 堆栈和变量!本节就是总结在linux上的调试方法(针对单文件 项目的我还没学):distorted_face:

我们使用g++在linux上进行调试,首先我们要先编译出一个debug版本,这里从基础说起

通用知识

如何编译一个程序

我们的目录结构是

├── common
│   ├── common.cpp
│   └── common.h
└── server.cpp

其中的结构是server.cpp include了common.h,common.cpp又是common.h的实现

g++ A.cpp B.cpp -o output -I .

这里涉及到一些编译原理的内容,因为编译器实际上并不会单独处理头文件(头文件不是编译单元),他只处理.cpp,头文件只是一种便利的声明,在被include到文件后会被展开,如

// header.h
void functionA();
void functionB();
​
// impletion.cpp
#include "header.h"
void functionA(){
    实现
}
void functionB(){
    实现
}
​
// main.cpp
#include "header.h"
int main(){
    
}

实际上主main和impletion会被展开成

// impletion.cpp
void functionA();
void functionB();
void functionA(){
    实现
}
void functionB(){
    实现
}
​
// main.cpp
void functionA();
void functionB();
int main(){
    
}

如果你自己每个文件都手敲声明的话比较麻烦,所以c++允许你写到一个单独的文件里然后include他们。但是对编译器来说,在头文件被展开后就不单独看了;到了编译这一步头文件已经被展开到各个实际的文件里了。所以回到刚才的话题,我们要传给g++的参数是server.cpp和common.cpp,即头文件的实现文件和主文件。

-o表示你要输出的二进制的文件名,如output,-I表示搜索头文件的根目录,编译器在展开头文件的阶段会找include提到的文件名;我们的头文件放在当前文件夹的common下,就从当前文件夹开始搜索,写common也行,但是以后可能还有别的文件夹,直接从当前文件夹开始方便以后扩展。

如何编译出debug版本的程序

主要是两点

  • 添加调试信息 -g

  • 关闭大部分优化 -O0

g++ A.cpp B.cpp -o output -I . -g -O0

-O(大写)后面跟的数字是优化等级,可以是0 1 2 3 s等等,代表不优化/基础/通用/激进/体积

我们一般的release版本优化的等级就是-O2, debug版本自然要比2低,这里直接选0, 防止优化过度导致调试的时候断点乱跳/缺失信息

额外的警告

为了开启所有警告还要加上

  • -Wall 所有常见警告(不是所有警告 是所有常见)

  • -Wextra 额外警告

  • -Wpedantic 迂腐的 严格的检查是否符合指定的c++标准,无扩展无非标准写法,有的话警告

g++ -std=c++17 A.cpp B.cpp -o output -I . -g -O0 -Wall -Wextra -Wpedantic

最终的命令变成了这样

kisaragi@ubuntu24:~/Documents/Epoll$ g++ -std=c++17 server2.cpp common/common.cpp -g -O0 -Wextra -Wall -Wpedantic -o testDebug

编译成功 我们得到了testDebug二进制文件

古法 直接使用GDB

打开你的终端,使用gdb 二进制文件 命令来调试

可以通过file 二进制文件 来查看二进制的信息

image

正常的应该是with debug_info, not stripped,表示有调试信息,符号未被剥离,这里我们自己编的,应该不会错

image

启动命令,正式进入到gdb的界面中

但是还没显示代码,按ctrl+x后按a键打开代码显示,效果如下,看起来就清晰多了

image

gdb里的操作都是通过在(gdb)后面打命令实现的,如next, step,break等等;

gdb有很多命令,对于习惯windows调试的我们来说,首先要找出怎么打断点,怎么继续,怎么进入函数, 怎么查看堆栈

流程基础操作

F5继续-->continue
F10下一行-->next
F11进入-->step

我们尝试在main上打一个断点,打断点的命令是break 函数名或者行号,我们直接berak main(),就在main函数上打了个断点,

image
image

代码旁边也会显示一个小小的标志,现在可以直接将程序运行起来, 命令是run,等待一会,程序就会断在main第一行了

image

B+旁边的>角标就是当前行的指示器,我们输入两个next,让他运行到190行,然后看看threads的内容,查看变量的内容是

也可以直接通过start来启动,他的作用和在main上打个断点然后run是一样的

查看变量

print 变量
image
image

可以看到目前还没有内容,这是对的,因为刚初始化,监视变量也很简单,使用watch 变量 就可以进行监视,watch threads,当threads被改变时就会断住。

想要删除断点/监视也很简单,使用 info breakpoints查看所有断点

image

这里可以看到有我们在main里打的,还有刚刚watch的变量,然后我们就可以通过disable 编号 或者 delete 编号来编辑了,如这里删除3号断点,使用delete 3,再查看就没有了

断点操作

break 行号/函数名()  打断点
info breakpoints 查看断点
delete 断点
image

现在我们随便进一个函数看看,比如threads.push_back()的push_back方法,先运行到这一行,然后输入step就可以进入了

进出函数

step 相当于f11进入
finish 相当于shift+11出函数
image

成功进入,不想看了就输入finish,就可以进入上一级,相当于shift+f11, 如果你已经step进入很深了,需要多几次才能出去。也可以直接在外面打断点然后continue,和我们在windows上使用都是一样的

调用堆栈

bt或backtrace
image

常用的就这些命令,玩够了,打quit直接退出

使用vscode

直接使用vscode的remote ssh插件连接到你的服务器,打开文件夹(关于这个插件的使用可以网上搜教程)

image

终端里tree一下(tree .),复制文件夹结构

├── common
│   ├── common.cpp
│   └── common.h
└── server.cpp

在你的源码目录下新建一个.vscode文件夹,里面新建个launch.json,然后打开ai:

我想要用gdb调试程序,需要/不需要编译,给我写一个vscode里的launch.json,操作系统是xxx,
文件夹结构如下:
├── common
│   ├── common.cpp
│   └── common.h
└── server.cpp
image
image

ai直接拿捏,这里因为我说需要编译, ai把tasks.json也补上了,都拷贝进来就好了

然后打开你的源代码,在vscode里按F5,选择使用g++或类似的选项(使用gdb?可能),ai的配置写的没错就可以顺利启动了

image

这时直接就可以看到堆栈,断点,监视,变量等信息,比gdb要现代化的多,但他的信息其实也是从gdb里取的,只是换了种展示形式;现在你可以像在windwos里一样调试程序了

:cat_with_wry_smile:本节完