当前位置: 首页 > article >正文

GDB 调试完全指南:从入门到工程实战

GDB 调试完全指南从入门到工程实战这份教程旨在帮助你建立系统的调试思维不仅掌握命令更掌握解决复杂问题的方法。第一章工欲善其事环境与配置在开始调试之前必须确保你的“武器”已经就绪。GDB 无法调试一个被剥离了符号信息的程序。1.1 编译选项配置 (CMake)在工程化开发中我们使用 CMake 管理构建。默认 Release 模式会移除调试信息并优化代码导致调试时变量无法查看或行号错乱。CMakeLists.txt 最佳实践# 推荐设置构建类型为 Debug 或 RelWithDebInfo # Debug: 包含完整调试信息无优化开发阶段首选 # RelWithDebInfo: 包含调试信息开启 O2 优化性能调优时使用 set(CMAKE_BUILD_TYPE Debug) # 确保添加 -g 标志 set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)1.2 安装与验证Linux:sudo apt-get install gdb(Ubuntu/Debian) 或sudo yum install gdb(CentOS).Windows:推荐安装MinGW或使用WSL (Windows Subsystem for Linux)获得原生体验。验证:输入gdb -v查看版本信息。第二章核心工作流掌控程序执行这是你日常开发中最常用的部分涵盖了从启动到单步执行的全过程。2.1 启动与参数传递GDB 启动程序有三种常见方式分别对应不同场景场景命令示例说明标准启动gdb ./my_app启动后在 GDB 内部输入run带参数启动gdb --args ./my_app arg1 arg2启动时直接传入命令行参数静默启动gdb ./my_app -q-q屏蔽版权信息清爽2.2 运行控制进入(gdb)界面后使用以下命令控制程序run(或r): 开始执行程序。如果程序已经在运行则表示重启程序。start: 在main函数的第一行设置临时断点并启动。适合只想调试main函数逻辑不想处理库初始化代码的场景。continue(或c): 继续执行直到遇到下一个断点或程序结束。2.3 断点管理断点是调试的锚点。基础断点:break main: 在 main 函数入口打断点。break 10: 在当前文件的第 10 行打断点。break file.cpp:20: 在指定文件的指定行打断点。条件断点 (神器):场景循环 1000 次只有第 999 次崩溃。命令break 15 if i 999作用只有当条件满足时程序才会暂停。查看与管理:info breakpoints: 查看所有断点列表包含编号。delete 1: 删除编号为 1 的断点。disable 1/enable 1: 暂时禁用或启用断点。2.4 单步执行程序停在断点后需要逐行分析next(或n):单步跳过。执行下一行代码不进入函数内部。这是最常用的命令。step(或s):单步进入。如果下一行是函数调用会进入该函数内部的第一行。finish: 执行完当前函数并停在函数返回处跳出当前函数。until: 执行直到循环结束快速跳出死循环。第三章透视程序状态数据与堆栈程序停下来了你需要知道“现在发生了什么”。3.1 查看变量print(或p):p variable: 打印变量值。p *ptr: 打印指针指向的内容。p array[0]10: 打印数组前 10 个元素。p/x variable: 以十六进制格式打印。display:display variable: 每次程序暂停时自动打印该变量的值。undisplay 1: 取消自动打印。3.2 堆栈回溯 (核心技能)当程序崩溃Segmentation Fault时这是你唯一的救命稻草。backtrace(或bt): 显示函数调用堆栈。输出示例#0 0x00005555... in processImage (img...) at main.cpp:10 #1 0x00005555... in main () at main.cpp:25解读#0是崩溃现场#1是调用者。frame(或f): 切换堆栈帧。f 1: 切换到main函数的上下文查看当时的局部变量。3.3 内存与寄存器x(Examine): 查看内存。x/10xw 0x123456: 以十六进制字格式查看地址 0x123456 开始的 10 个单位内存。info registers: 查看 CPU 寄存器状态底层调试用。第四章进阶实战解决复杂问题4.1 附加到正在运行的进程 (Attach)场景程序已经在服务器上跑起来了或者程序启动很慢你不想重启只想调试当前的状态。查找进程 ID:ps aux | grep my_app或pidof my_app。附加调试:gdb-pPID# 或者gdb ./my_appPID操作: 此时程序会暂停。你可以设置断点输入c继续运行。分离: 调试完成后输入detach让程序继续在后台运行然后quit。4.2 多线程调试场景多线程死锁或竞争。info threads: 查看所有线程列表。thread ID: 切换到指定 ID 的线程。thread apply all bt:打印所有线程的堆栈排查死锁必备。4.3 观察点场景一个全局变量莫名其妙被修改了不知道是谁改的。watch variable: 当variable的值发生改变时程序自动暂停。watch *0x123456: 监控特定内存地址的变化。第五章线上救火Core Dump 尸检场景程序在客户现场崩溃了生成了一个“尸体”文件Core Dump你需要远程分析。5.1 开启 Core DumpLinux 默认可能关闭此功能。在运行程序前执行ulimit-cunlimited# 设置 core 文件大小为无限制程序崩溃后当前目录下会生成core或core.pid文件。5.2 尸检流程将core文件和对应的可执行文件必须包含调试符号即 Debug 版拷贝到调试机。gdb ./my_app core进入 GDB 后直接输入bt你就能像穿越时空一样看到程序崩溃那一瞬间的完整调用栈。附录GDB 常用命令速查表分类命令 (缩写)作用备注运行run(r)启动/重启程序continue(c)继续运行直到下一个断点断点break(b)设置断点b main,b 10,b func if x0info breakpoints查看断点列表单步next(n)单步跳过最常用不进函数step(s)单步进入进函数内部finish执行完当前函数跳出当前函数查看print(p)打印变量p var,p *ptrbacktrace(bt)查看调用栈崩溃分析核心display自动打印变量其他list(l)查看源码quit(q)退出 GDB实际应用太棒了你已经掌握了基础调试现在我们直接进入GDB 的高阶领域。这部分内容通常区分了“会用调试器”和“精通调试”的工程师。我们将通过三个实战模块带你解决最棘手的死锁问题复盘真实的崩溃现场并学会用脚本解放双手。 模块一死锁侦探 —— 破解“永恒的等待”死锁是最令人头疼的问题之一程序不崩、不报错就是卡住不动Hang 住。这通常是因为线程 A 等线程 B 释放锁而线程 B 又在等线程 A。1. 场景模拟假设你有一个多线程程序deadlock_app运行一会儿就卡住了。2. 破案流程第一步附加到进程不要重启程序直接“抓现行”。# 1. 找到卡住的进程 IDpsaux|grepdeadlock_app# 2. 附加 GDBsudogdb-pPID第二步查看线程状态进入 GDB 后输入(gdb) info threads你会看到类似输出Id Target Id Frame * 1 Thread 0x7f... (LWP 12345) app 0x00007f... in __lll_lock_wait () 2 Thread 0x7f... (LWP 12346) app 0x00007f... in __lll_lock_wait ()线索注意看Frame列如果多个线程都停在__lll_lock_wait底层锁等待函数那大概率是死锁了。第三步分析谁拿着钥匙锁这是最关键的一步。我们需要知道谁拿着锁谁在等锁。切换到线程 1(gdb) thread 1 (gdb) bt # 查看堆栈看它在哪一行卡住假设输出显示它卡在pthread_mutex_lock(mutex_B)说明它在等mutex_B。查看锁的状态我们需要知道mutex_B现在被谁拿走了。(gdb) p mutex_B输出可能像这样$1 {__data {__lock 1, __count 0, __owner 12346, ...}}关键点__owner 12346。这说明mutex_B被线程 ID 为 12346 的线程持有。切换到线程 2 (ID 12346)(gdb) thread 2 (gdb) bt查看线程 2 的堆栈发现它卡在pthread_mutex_lock(mutex_A)。检查线程 2 在等谁(gdb) p mutex_A输出显示__owner 12345也就是线程 1。结论线程 1 持有 A在等 B。线程 2 持有 B在等 A。死锁成立解决方案统一锁获取顺序比如都先拿 A 再拿 B或者使用try_lock。️‍♂️ 模块二真实案例复盘 —— 偶发的段错误背景一个图像处理服务偶尔会报Segmentation Fault但无法稳定复现。日志里只有一句冷冰冰的“段错误”。1. 保护现场 (Core Dump)既然无法复现我们就必须在它崩溃的那一刻“保存尸体”。操作在服务器启动程序前执行ulimit-cunlimited# 允许生成无限大小的 core 文件假设程序崩了生成了core.12345文件。2. 穿越时空 (事后分析)把core.12345和你的程序image_service必须带调试符号拷回本地。gdb ./image_service core.123453. 案发现场还原进入 GDB 后直接输入bt(gdb) bt #0 0x00007f8a5b1a5f25 in raise () from /lib/x86_64-linux-gnu/libc.so.6 #1 0x00007f8a5b18f897 in abort () from /lib/x86_64-linux-gnu/libc.so.6 #2 0x00007f8a5b1e2fba in ?? () from /lib/x86_64-linux-gnu/libc.so.6 #3 0x00007f8a5b1ec4dc in __libc_message () from /lib/x86_64-linux-gnu/libc.so.6 #4 0x00007f8a5b1f3d10 in __stack_chk_fail () from /lib/x86_64-linux-gnu/libc.so.6 #5 0x00005555555551a2 in processImage (img...) at src/image.cpp:45 #6 0x00005555555552b5 in main () at src/main.cpp:20分析虽然前面几帧是系统库但往下看#5崩溃发生在src/image.cpp的第 45 行。输入frame 5切换到那一帧。输入list查看代码40voidprocessImage(cv::Matimg){41intheightimg.rows;42// ...45uchar*dataimg.ptruchar(height1);// 越界访问46}真相大白代码里写死了height 1导致访问了非法内存。 模块三自动化脚本 —— 让 GDB 替你加班手动敲命令太累了。对于重复性的调试比如每次都要看这 5 个变量我们可以写脚本。1. 简单的命令脚本 (debug.gdb)创建一个文本文件debug.gdb# 1. 自动设置断点 break main break processImage # 2. 运行程序 run # 3. 定义一个自定义命令一键打印关键信息 define check_state printf 当前堆栈 \n bt printf 关键变量 \n print img.rows print img.cols print is_running end # 4. 当停在断点时自动执行 check_state (可选) # 这里我们只是定义它你可以在 GDB 里手动敲 check_state使用方法gdb-xdebug.gdb ./my_appGDB 会自动加载脚本设置好断点并运行。2. 高级自动化Python 脚本GDB 内置了 Python 解释器你可以写复杂的逻辑。比如自动检测死锁。创建一个detect_deadlock.pyimportgdbclassDeadlockDetector(gdb.Command):def__init__(self):super(DeadlockDetector,self).__init__(detect-deadlock,gdb.COMMAND_USER)definvoke(self,arg,from_tty):print(正在分析线程状态...)# 获取所有线程信息 (需要 GDB 支持)threadsgdb.selected_inferior().threads()waiting_threads[]fortinthreads:# 简单的启发式检查如果线程停在 __lll_lock_waitif__lll_lock_waitinstr(t.frame()):waiting_threads.append(t)iflen(waiting_threads)1:print(⚠️ 警告发现多个线程在等待锁可能存在死锁。)fortinwaiting_threads:print(f线程{t.num}堆栈:)# 这里可以进一步解析堆栈else:print(未发现明显的死锁特征。)# 注册命令DeadlockDetector()使用方法在 GDB 中(gdb) python import sys; sys.path.append(.) (gdb) python import detect_deadlock (gdb) detect-deadlock3. 自动化测试集成 (CI/CD)你可以把 GDB 脚本集成到 Jenkins 或 GitHub Actions 中。如果程序崩溃自动运行 GDB 脚本抓取堆栈并保存为日志文件。# 示例在 CI 脚本中gdb-batch-exrun-exbt-exquit./my_appcrash_log.txt21-batch模式让 GDB 执行完命令后自动退出非常适合自动化流水线。 总结死锁调试核心是info threads和p mutex通过锁的owner字段画出等待环。Core Dump是线上救命的稻草ulimit -c unlimited必须开bt是分析核心。脚本化简单的用.gdb文件复杂的用 Python 扩展把重复劳动交给机器。掌握这三块你在 Linux C 调试领域就已经是专家级别了有vscode 等IDE直接调试,为什么还要用gdb你说得对在 VS Code 里点“运行和调试”确实比敲命令行舒服多了。但这里有一个核心概念需要厘清VS Code 只是“壳”GDB 才是“核”。你在 VS Code 里点的每一个按钮设置断点、单步跳过、查看变量本质上都是 VS Code 在后台帮你把图形化操作翻译成了 GDB 指令发送给底层。既然如此为什么我还要强调你必须懂 GDB 命令行因为在 Linux 工程化开发特别是涉及 OpenCV/YOLO 部署中纯靠 VS Code 的图形界面有四个致命的“盲区”1. 远程服务器开发最常见场景工业界的 YOLO 模型通常是部署在没有图形界面的服务器或嵌入式设备如 Jetson、树莓派上的。场景你通过 SSH 连到服务器程序崩了。VS Code如果你没有配置极其复杂的 Remote-SSH 环境或者服务器没装 X11 转发VS Code 的图形调试器根本起不来。GDB只要你能 SSH 连上去就能用 GDB。它是 Linux 的原生组件无需任何图形支持。2. “尸体”分析Core Dump这是 VS Code 完全无法替代的领域。场景你的程序在客户的生产环境比如一台断网的工控机上运行了 3 天 3 夜突然崩了。你不可能在那台机器上挂着 VS Code 等它崩。现实机器生成了一个core文件内存快照。你需要把这个文件拷回来在你的电脑上用 GDB 加载分析gdb ./app core。VS Code无法直接加载 core 文件进行可视化调试你必须用命令行看堆栈。3. 自动化与脚本化当你需要批量测试或集成到 CI/CD 流水线时需求你需要跑 1000 次测试只要出现“段错误”就自动记录堆栈并保存日志。GDB可以写脚本.gdbinit或使用gdb -batch模式自动运行完全不需要人盯着屏幕。VS Code必须有人坐在电脑前点鼠标。4. 解决“调试器起不来”的诡异问题VS Code 的图形界面依赖于externalConsole和终端模拟器如xterm。坑有时候因为环境变量或终端配置问题VS Code 点击调试后一直转圈或者无法捕获输入。解决这时候如果你懂 GDB直接在终端敲gdb ./app就能绕过 VS Code 的配置坑快速定位是代码问题还是 IDE 配置问题。 总结两者的关系你可以把它们的关系理解为汽车驾驶VS Code是自动驾驶/仪表盘平时开车写代码主要靠它直观、方便、可视化。它能帮你把复杂的 GDB 指令转化为可视化的变量窗口。GDB 命令行是手动挡/修车工具当车坏了崩溃、路况复杂远程服务器、或者自动驾驶失灵配置错误时你必须得会手动换挡甚至下车修车。我的建议平时开发首选 VS Code图形调试效率最高。但必须掌握 GDB 基础命令特别是bt,print,run这是你作为 C 工程师的“保底技能”关键时刻能救命。

相关文章:

GDB 调试完全指南:从入门到工程实战

GDB 调试完全指南:从入门到工程实战 这份教程旨在帮助你建立系统的调试思维,不仅掌握命令,更掌握解决复杂问题的方法。第一章:工欲善其事(环境与配置) 在开始调试之前,必须确保你的“武器”已经…...

天力监控看板:大宗材料与汇率波动的智慧管家

在复杂多变的市场环境中,大宗材料价格及汇率的波动直接影响着企业的成本控制和盈利能力。为了更好地应对这些挑战,JBoltAI团队为天力定制开发了一款大宗材料及汇率波动监控看板,为企业提供全面、实时、可追溯的数据监控与分析工具。一、总览看…...

Compose:1.3 组合、重组作用域和 remember()

文章目录recompose 重组rememberrecompose 性能风险与智能优化、Stablerecompose 智能优化Stable小结总结recompose 重组 我们先上一段代码,你觉得下面代码最终执行结果是什么: setContent {// 注意:这里将 MutableState 放在 setContent {…...

Sciter核心架构深度解析:理解嵌入式UI引擎的工作原理

Sciter核心架构深度解析:理解嵌入式UI引擎的工作原理 【免费下载链接】sciter-sdk Sciter is an embeddable HTML/CSS/scripting engine 项目地址: https://gitcode.com/gh_mirrors/sc/sciter-sdk Sciter是一款功能强大的嵌入式HTML/CSS/脚本引擎&#xff0c…...

神经网络实战技巧:从权重初始化到模型部署优化

1. 神经网络实战技巧综述在咖啡厅里打开笔记本电脑调试神经网络的日子,我总会在键盘旁边放一本翻得卷边的《Neural Tricks of the Trade》。这本书不像传统教材那样堆砌数学公式,而是收录了数十位从业者在实战中总结的"黑科技"。今天我就结合自…...

解锁微软VS Code扩展限制:在非官方编辑器中使用C#/C++扩展

1. 项目概述与背景 如果你是一名深度使用非官方 VS Code 分支(比如 Cursor、VSCodium、Code - OSS)的开发者,那么你很可能在尝试安装微软官方出品的 C# 或 C/C 扩展时,遇到过那个令人沮丧的弹窗:“The C/C extension …...

OpenBullet2配置详解:深入理解每个参数的作用与调优

OpenBullet2配置详解:深入理解每个参数的作用与调优 【免费下载链接】OpenBullet2 OpenBullet reinvented 项目地址: https://gitcode.com/gh_mirrors/op/OpenBullet2 OpenBullet2是一款强大的自动化测试工具,通过灵活的配置参数可以实现各种复杂…...

R语言机器学习数据集处理与建模实战指南

1. 为什么选择R语言处理机器学习数据集?R语言作为统计计算领域的经典工具,在数据处理和可视化方面有着天然优势。CRAN(Comprehensive R Archive Network)上超过15,000个扩展包中,有超过1/3与数据分析和机器学习直接相关…...

怎样通过三维CT查看是否有蛀牙

1 打开weasis-----调整到三视图2 这个时候左边的视图是上视图,因为牙齿有2排,所以需要过滤:--------------调节右下角视图中的红线到上下牙齿的交界处------------此时上视图会只显示出上排的牙齿3 这个时候还是只能确定有虫牙,但…...

RSpec-Rails-Examples自定义匹配器开发:如何创建可读性强的测试断言

RSpec-Rails-Examples自定义匹配器开发:如何创建可读性强的测试断言 【免费下载链接】rspec-rails-examples eliotsykes/rspec-rails-examples: RSpec-Rails-Examples 是一个用于 Rails 应用程序测试的示例库,提供了多种 RSpec 测试的示例和教程&#xf…...

词嵌入技术解析:从Word2Vec到工业应用

1. 词嵌入技术全景解读2013年Word2Vec的横空出世彻底改变了自然语言处理的游戏规则。当时我在处理一个电商评论分类项目,传统TF-IDF方法在语义相似度判断上表现糟糕,直到尝试了词向量——"手机"和"智能手机"的余弦相似度达到0.92&am…...

Geo-Bootstrap实战案例:创建具有90年代魅力的个人作品集网站

Geo-Bootstrap实战案例:创建具有90年代魅力的个人作品集网站 【免费下载链接】geo-bootstrap A timeless Twitter Bootstrap theme built for the modern web. 项目地址: https://gitcode.com/gh_mirrors/ge/geo-bootstrap Geo-Bootstrap是GitHub加速计划中的…...

基于eBPF的ingraind安全监控探针:原理、部署与实战指南

1. 项目概述:基于eBPF的现代安全监控探针如果你在运维一个规模化的容器集群,或者管理着成百上千的Linux服务器,那么“监控”这个词对你来说,可能既熟悉又头疼。熟悉的是,我们离不开CPU、内存、磁盘IO这些基础指标&…...

开源代码生成工具MassGen:模板驱动,解放重复编码生产力

1. 项目概述:一个面向开发者的开源代码生成工具最近在和一些做企业级应用开发的朋友聊天,大家普遍提到一个痛点:面对那些高度重复、模式固定的业务代码(比如增删改查的Controller、Service、DAO层,或者基于数据库表结构…...

Geo-Bootstrap开发者深度指南:源码结构与扩展开发

Geo-Bootstrap开发者深度指南:源码结构与扩展开发 【免费下载链接】geo-bootstrap A timeless Twitter Bootstrap theme built for the modern web. 项目地址: https://gitcode.com/gh_mirrors/ge/geo-bootstrap Geo-Bootstrap是一个为现代Web构建的经典Twit…...

chrome-cdp工作原理解析:如何通过WebSocket与Chrome DevTools协议通信

chrome-cdp工作原理解析:如何通过WebSocket与Chrome DevTools协议通信 【免费下载链接】chrome-cdp-skill Give your AI agent access to your live Chrome session — works out of the box, connects to tabs you already have open 项目地址: https://gitcode.…...

量子纠缠检测的SWAP测试原理与光子芯片实现

1. 量子纠缠检测的核心挑战与SWAP测试原理量子纠缠作为量子计算最独特的资源,其检测与量化一直是量子信息科学的核心课题。传统纠缠见证方法通常需要完整量子态层析,这随系统规模呈指数级增长的计算复杂度严重制约了实际应用。而基于SWAP测试的两比特纠缠…...

Motor Admin与现有系统集成:无缝对接企业应用生态

Motor Admin与现有系统集成:无缝对接企业应用生态 【免费下载链接】motor-admin Deploy a no-code admin panel for any application in less than a minute. Search, create, update, and delete data entries, create custom actions, and build reports. 项目地…...

开源代码审计工具opencode:基于异常检测的智能安全扫描实践

1. 项目概述:一个开源代码审计与异常检测工具最近在跟几个做安全开发的朋友聊天,大家普遍提到一个痛点:项目大了,代码库动辄几十万行,每次上线前的人工代码审计(Code Review)都像大海捞针&#…...

Dantotsu常见问题解答:解决登录失败、下载错误与性能优化技巧

Dantotsu常见问题解答:解决登录失败、下载错误与性能优化技巧 【免费下载链接】Dantotsu Anilist client based on Saikou 项目地址: https://gitcode.com/gh_mirrors/da/Dantotsu Dantotsu是一款基于Saikou的Anilist客户端,为动漫爱好者提供便捷…...

ARM1020E处理器勘误与硬件调试实战指南

1. ARM1020E Rev1处理器勘误深度解析作为一名长期从事ARM架构开发的工程师,我深知处理器勘误(Errata)对系统稳定性的关键影响。今天我将结合ARM1020E Rev1的实际案例,分享三类勘误的处理经验,特别是硬件调试中的典型问…...

GAN七日实战:从原理到PyTorch实现

1. 生成对抗网络入门指南:7天速成实战路线第一次接触GAN时,我被它生成的人脸图片震撼得说不出话——那些根本不存在的人像,连皮肤纹理和发丝都栩栩如生。作为计算机视觉领域的革命性技术,生成对抗网络(GAN)…...

Preact高阶组件:逻辑复用的终极设计模式指南

Preact高阶组件:逻辑复用的终极设计模式指南 【免费下载链接】preact ⚛️ Fast 3kB React alternative with the same modern API. Components & Virtual DOM. 项目地址: https://gitcode.com/gh_mirrors/pr/preact 在现代前端开发中,高效的…...

如何快速掌握Preact:从零开始的现代前端框架完整指南

如何快速掌握Preact:从零开始的现代前端框架完整指南 【免费下载链接】preact ⚛️ Fast 3kB React alternative with the same modern API. Components & Virtual DOM. 项目地址: https://gitcode.com/gh_mirrors/pr/preact Preact是一个仅4kB大小的现代…...

正则表达式终极指南:10个文本处理匹配技巧

正则表达式终极指南:10个文本处理匹配技巧 【免费下载链接】interview 📚 C/C 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of the b…...

如何快速定制Material Design Lite主题:掌握SCSS变量与颜色系统的终极指南

如何快速定制Material Design Lite主题:掌握SCSS变量与颜色系统的终极指南 【免费下载链接】material-design-lite Material Design Components in HTML/CSS/JS 项目地址: https://gitcode.com/gh_mirrors/ma/material-design-lite Material Design Lite&…...

CGraph扩展开发指南:如何自定义节点与适配器

CGraph扩展开发指南:如何自定义节点与适配器 【免费下载链接】CGraph 【A common used C & Python DAG framework】 一个通用的、无三方依赖的、跨平台的、收录于awesome-cpp的、基于流图的并行计算框架。欢迎star & fork & 交流 项目地址: https://g…...

掌握Noto Emoji:构建跨平台表情符号的终极视觉工具箱

掌握Noto Emoji:构建跨平台表情符号的终极视觉工具箱 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji 当你发送一个笑脸表情时,是否曾想过它如何在iPhone、Android和Windows电脑上保持完全…...

智能体技能开发实战:从工具调用到系统架构的完整指南

1. 项目概述与核心价值最近在探索智能体(Agent)开发时,我发现了一个宝藏仓库:heilcheng/awesome-agent-skills。这不仅仅是一个简单的列表,而是一个由社区驱动的、关于智能体“技能”的精选知识库。简单来说&#xff0…...

langsmith-fetch技能:调试LangChain和LangGraph代理的必备工具

langsmith-fetch技能:调试LangChain和LangGraph代理的必备工具 【免费下载链接】awesome-codex-skills A curated list of practical Codex skills for automating workflows across the Codex CLI and API. 项目地址: https://gitcode.com/GitHub_Trending/aw/aw…...