gdb 开始调试开始上手
1. 开启core, 采集程序崩溃的状态首先你跟着我做开启core崩溃状态采集. 可以通过 ulimit -c 查看 如果是0表示没有开启. 开启按照下面操作su root vi /etc/profile Shift G i # No core files by default 0, unlimited is oo ulimit -S -c unlimited /dev/null 21 wq! source /etc/profile上面shell 操作是 在 /etc/profile 最后一行添加 上面设置全局开启 core文件调试,大小不限. 最后 立即生效.再跟着我做, 因为生成的core文件同名会覆盖. 这里为其加上一个 core命名规则, 让其变成 [core.pid] 格式.su root vi /etc/sysctl.conf Shift G i # open, add core.pid kernel.core_pattern ./core_%t_%p_%e kernel.core_uses_pid 1 wq! sysctl -p /etc/sysctl.conf在 /etc/sysctl.conf 文件中添加系统配置. 后面立即启用. 最后是下面状态表示core启用都搞好了.2. 简单接触 GDB , 开始调试 r n p第一个演示代码 heoo.c#include stdio.h int g_var 0; static int _add(int a, int b) { printf(_add callad, a:%d, b:%d\n, a, b); return ab; } int main(void) { int n 1; printf(one n%d, g_var%d\n, n, g_var); n; --n; g_var 20; g_var - 10; n _add(1, g_var); printf(two n%d, g_var%d\n, n, g_var); return 0; }我们下面从图说起.(如果用视频说更好,文字和图意义在于查询方便.更简约)第一个命令 gdb heoo.out 表示 gdb加载 heoo.out 开始调试. 如果需要使用gdb调试的话编译的时候 gcc 需要加上 -g命令.其中l命令表示 查看加载源码内容. 下面将演示如何加断点.r 表示调试的程序开始运行.p 命令表示 打印值. n表示过程调试, 到下一步. 不管子过程如何都不进入. 直接一次跳过.上面用的s 表示单步调试, 遇到子函数,会进入函数内部调试.总结一下 .l 查看源码 , b 加断点, r 开始运行调试, n 下一步, s下一步但是会进入子函数. p 输出数据.到这里gdb 基本会用了. 是不是也很容易. 直白. 小代码可以随便调试了.看到这里基础知识普及完毕了. 后面可以不看了. 有机会再看. 好那我们接着扯.正文 第一部分 gdb其它开发中用的命令开始扯一点, linux总是敲命令操作, 也很不安全. 有时候晕了. 写这样编译命令.gcc -g -Wall -o heoo.c heoo.out非常恐怖, heoo.c 代码删除了. heoo.out heoo.c 先创建后生成失败退出. 原先的内容被抹掉了. 哈哈. 服务器开发, 经验不足, 熟练度不够.自己都怕自己.1. gdb 其它常用命令用法 c q b info首先看 用到的调试文件 houge.c#include stdio.h #include stdlib.h #include time.h /* * arr 只能是数组 * 返回当前数组长度 */ #define LEN(arr) (sizeof(arr)/sizeof(*arr)) // 简单数组打印函数 static void _parrs(int a[], int len) { int i -1; puts(当前数组内容值如下:); while(i len) printf(%d , a[i]); putchar(\n); } // 简单包装宏, arr必须是数组 #define PARRS(arr) \ _parrs(arr, LEN(arr)) #define _INT_OLD (23) /* * 主函数,简单测试 * 测试 core文件, * 测试 宏调试 * 测试 堆栈内存信息 */ int main(void) { int i; int a[_INT_OLD]; int* ptr NULL; // 来个随机数填充值吧 srand((unsigned)time(NULL)); for(i0; iLEN(a); i) a[i] rand()%222; PARRS(a); //全员加double, 包含一个错误方便测试 for(i1; iLEN(a); i) a[i] 1; PARRS(a); // 为了错,强制错 *ptr 0; return 0; }同样需要仔细看下面图中使用的命令. 首先对前言部分加深一些. 看下面这个图是前言的补充, c跳过直到下一个断点处, q表示程序退出.在 houge.c 中我们开始调试. 一运行段错误, 出现了我们的 core.pid 文件通过gdb houge.out core.27047开始调试. 马上定位出来了错误原因.2. 调试 内存堆栈信息刚开始 print a , 在main中当做数组处理.打印的信息多. 后面在_add函数中, a就是个形参数组地址.主要看info args 查看当前函数参数值info locals 看当前函数栈上值信息, info registers 表示查看寄存器值.后面查看内存信息需要记得东西多一些. 先看图x /23dw a意思是 查看 从a地址开始 23个 4字节 有符号十进制数 输出.关于x 更加详细见下面用gdb查看内存格式: x /nfu ptr 说明 x 是 examine 的缩写 n表示要显示的内存单元的个数 f表示显示方式, 可取如下值 x 按十六进制格式显示变量。 d 按十进制格式显示变量。 u 按十进制格式显示无符号整型。 o 按八进制格式显示变量。 t 按二进制格式显示变量。 a 按十六进制格式显示变量。 i 指令地址格式 c 按字符格式显示变量。 f 按浮点数格式显示变量。 u表示一个地址单元的长度 b表示单字节 h表示双字节 w表示四字节 g表示八字节 Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char) and s(string). Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes) ptr 表示从那个地址开始这个命令常用于监测内存变化.调试中特别常用.3. gdb 设置条件断点很简单b 17 if i 8.在17行设置一个断点,并且只有i8的时候才会触发.4. gdb 删除断点gdb 删除有d后面跟断点索引1,2,3..clear行数或名称. 删除哪一行断点. 看下面演示到这里 介绍的gdb调试技巧基本都够用了. 感觉用图形ide,例如vs调试也就用到这些了.估计gdb调试突破20min过去了.够用了. 后面可以不用看了.正文 第二部分 gdb 多线程多进程调试到这里实战中用的机会少了, 也就老鸟会用上些. 这部分可以调试,不好调试. 一般一调估计小半天就走了. 好,那我们处理最后10min.1. 首先对上面正文第一部分加深 gdb调试宏首先看上面命令macro expand 宏(参数)得到宏导出内容.info macro 宏名 宏定义内容如果你需要用到上面gdb功能, 查看和导出宏的话.还需要gcc 支持,生成的时候加上-ggdb3如下gcc -Wall -ggdb3 -o houge.out houge.c就可以使用了. 扩展一下 对于 gcc 编译的有个过程叫做 预编译gcc -E -o *.i *.c.这时候处理多数宏,直接展开, 也可以查看最后结果. 也算也是一个黑科技.2. 开始多线程调试首先看测试用例 dasheng.c#include stdio.h #include stdlib.h #include pthread.h // 声明一个都用的量 static int _old; // 线程跑的函数 static void* _run(void* arg) { int piyo 10; int n *(int*)arg; int i; //设置线程分离 pthread_detach(pthread_self()); for(i0; in; i) { printf(n%d, i%d\n, n, i); _old; printf(n%d, piyo %d, _old%d\n, n, piyo, _old); } return NULL; } #define _INT_PTX (3) int main(void) { int i, rt, j; pthread_t tx[_INT_PTX]; puts(main beign); for(i0; i_INT_PTX; i) { // i 是有问题的, 但是这里为了测试, 可以乱搞 rt pthread_create(txi, NULL, _run, i); if(rt 0) { printf(pthread_create create error! rt %d, i%d\n, rt, i); break; } } //CPU忙等待 for(j0; j1000000000; j) ; puts(end); return 0; }编译命令gcc -Wall -g -o dasheng.out dasheng.c -lpthread那先看下面测试图上面info threads 查看所有运行的线程信息. *表示当前调试的线程.后面 l _run 表示查看 _run附近代码.当然还有l 16查看16行附近文件内容.gdb多线程切换 测试如下thread 3表示切换到第三个线程, info threads 第一列id 就是 thread 切换的id.上面测试线程 就算你切换到 thread 3. 其它线程还是在跑的. 我们用下面命令 只让待调试的线程跑. 其它线程阻塞.set scheduler-locking on开始多线程单独调试. 不用了 设置set scheduler-locking off关闭. 又会回到你调试这个, 其它线程不阻塞.总结 多线程调试常用就这三个实用命令info threadsthread idset scheduler-locking on/off分别是查看,切换,设置同步调试.到这里多线程调试基本完毕了.3. 开始gdb 多进程调试首先看 liaobude.c 测试代码#include stdio.h #include stdlib.h #include errno.h #include unistd.h #include sys/types.h #include sys/wait.h // 声明一个都用的量 static int _old; // 线程跑的函数 static void _run(int n) { int piyo 10; int i; n; for(i0; in; i) { printf(n%d, i%d\n, n, i); _old; printf(n%d, piyo %d, _old%d\n, n, piyo, _old); } } #define _INT_PTX (3) int main(void) { int i; pid_t rt; puts(main beign); for(i0; i_INT_PTX; i) { // i 是有问题的, 但是这里为了测试, 可以乱搞 rt fork(); if(rt 0) { printf(fork clone error! rt %d, i%d\n, rt, i); break; } if(rt 0) { _run(i); exit(EXIT_FAILURE); } } //等待子进程结束 for(;;) { rt waitpid(-1, NULL, WNOHANG); if(rt0 || errnoEINTR) continue; break; } puts(end); // 这里继续等待 for(i0; i190; i){ printf(等待 有缘人[%d]!\n, i); sleep(1); } return 0; }编译命令gcc -Wall -g -o liaobude.out liaobude.c其实对多进程调试, 先介绍一个 常用的, 调试正在运行的程序. 首先让 ./liaobude.out 跑起来.再通过 ps -ef 找到需要调试的进程. 复制进程文件描述符pid.这时候启动gdb.attach pidgdb就把pid那个进程加载进来了. 加载的进程会阻塞到当前正在运行的地方. 直到使用命令控制. 这个功能还是非常猛的.最后介绍 进程调试的有关命令(需要最新的gdb才会支持). 多进程的调试思路和多线程调试流程很相似.GDB可以同时调试多个程序。 只需要设置follow-fork-mode(默认值parent)和detach-on-fork默认值on即可。 设置方法set follow-fork-mode [parent|child] set detach-on-fork [on|off] 查询正在调试的进程info inferiors 切换调试的进程 inferior infer number具体的意思有set follow-fork-mode [parent|child] set detach-on-fork [on|off]parent on 只调试主进程gdb默认child on 只调试子进程parent off 同时调试两个进程gdb跟主进程子进程block在fork位置child off 同时调试两个进程gdb跟子进程主进程block在fork位置更加详细的 gdb 多进程调试demo 可以参照 http://blog.csdn.net/pbymw8iwm/article/details/7876797使用方式和线程调试思路是一样的. 就是gdb 的命令换了字符. 工作中多进程调试遇到少.遇到了很少用gdb调试. 会用下面2种调试好办法2) 写单元测试3) 打日志检测日志,分析到这里 gdb30分钟内容讲解完毕. 多试试写写练一练, gdb基本突破没有问题.后记错误是难免的, 有问题可以随时交流. 拜~~, 周六下午愉快. 希望明天仍然是个好天气~~

相关新闻

ORM + SQLAlchemy

ORM + SQLAlchemy

ORM SQLAlchemy ORM 对象关系映射 SQLAlchemyTypes IntegerFloatBooleanDateDatetimeStringForeignKey from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Col…

2026/7/28 18:20:10 阅读更多 →
商城秒杀功能总结

商城秒杀功能总结

秒杀系统的场景特点:高并发、请求数量远远大于库存数量、下订单减库存。秒杀架构设计理念:限流、削峰、异步处理、缓存、可拓展。实现方案:限流、采用消息队列缓存、利用缓存应对读写请求。使用技术:前端:小程序后端&a…

2026/7/28 18:20:10 阅读更多 →
大一暑假集训最终考试(一)(2019.8.31)

大一暑假集训最终考试(一)(2019.8.31)

D题 nefu 1866 这是一道难题 思路&#xff1a;树状数组模板题。还有就是树状数组的单点修改只支持加减&#xff0c;不支持直接修改&#xff08;修改时先减去原来的数&#xff0c;再加上修改后的数即可&#xff09;。 坑的地方&#xff1a;没说查询时一定满足x<y&#xff0…

2026/7/28 18:20:10 阅读更多 →

最新新闻

物联网设备安全芯片SE050与PIC18F2585集成指南

物联网设备安全芯片SE050与PIC18F2585集成指南

1. 为什么物联网设备需要专用安全芯片&#xff1f;在物联网设备开发中&#xff0c;安全性常常是最容易被忽视却又至关重要的环节。传统MCU&#xff08;如PIC18F2585&#xff09;虽然能完成基础控制任务&#xff0c;但在面对现代网络安全威胁时往往力不从心。去年某智能家居厂商…

2026/7/28 18:34:13 阅读更多 →
顺序表应用1:多余元素删除之移位算法

顺序表应用1:多余元素删除之移位算法

Problem Description 一个长度不超过10000数据的顺序表&#xff0c;可能存在着一些值相同的“多余”数据元素&#xff08;类型为整型&#xff09;&#xff0c;编写一个程序将“多余”的数据元素从顺序表中删除&#xff0c;使该表由一个“非纯表”&#xff08;值相同的元素在表中…

2026/7/28 18:34:13 阅读更多 →
通用大模型VS垂域大模型,小白必看!收藏学习行业AI新趋势

通用大模型VS垂域大模型,小白必看!收藏学习行业AI新趋势

本文详细解析了通用大模型与垂域大模型的核心区别&#xff0c;旨在帮助初学者理解AI模型的不同应用目标和系统设计。文章从任务、数据、评估三个角度对比了两种模型&#xff0c;并探讨了企业选择AI方案时需考虑的关键因素。通用大模型擅长多任务处理&#xff0c;而垂域大模型则…

2026/7/28 18:34:13 阅读更多 →
NBM5100A与PIC18LF26K42的低功耗物联网设计解析

NBM5100A与PIC18LF26K42的低功耗物联网设计解析

1. 项目背景与核心价值在低功耗物联网设备设计中&#xff0c;纽扣电池供电方案一直面临两个关键挑战&#xff1a;一是电池寿命有限导致频繁更换&#xff0c;二是峰值电流输出能力不足制约设备功能。NBM5100A与PIC18LF26K42的组合方案&#xff0c;正是为解决这两大痛点而生。作为…

2026/7/28 18:34:13 阅读更多 →
dubbo实战01-入门案例

dubbo实战01-入门案例

学习一门新技术的时候&#xff0c;我们不仅要学会怎样运用这门技术&#xff0c;同时还必须明白这项技术是为了解决什么样的问题而产生的&#xff0c;真正做到知其然并知其所以然。dubbo 是什么 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架&#xff0c; 使得应用可通过高…

2026/7/28 18:34:13 阅读更多 →
JVS视角:工信部新提的“小快轻准“,到底在说什么

JVS视角:工信部新提的“小快轻准“,到底在说什么

最近工信部出了一份文件——《"小快轻准"数字化产品和服务培育指引&#xff08;2026年版&#xff09;》。四个字&#xff1a;小、快、轻、准。看着像口号&#xff0c;但细看内容&#xff0c;其实是对过去几年制造业数字化转型路线的一次方向性调整。过去几年行业里的…

2026/7/28 18:33:13 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿&#xff01;3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑&#xff1a;把几百页的财报、法规、技术手册扔给向量库&#xff0c;问一个具体问题&#xff0c;搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了&#xff0c;要么藏在几十条结果的最下面。语义相似≠真正相关&#xff0c;这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营&#xff0c;从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候&#xff0c;每天刷半小时抖音&#xff0c;手动把爆款视频的口播敲进备忘录&#xff0c;一条2分钟的视频得花十来分钟&#xff0c;碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻