gdb调试 与 coredump

gdb调试 与 coredump调试

  • 1. 启动gdb
  • 2.gdb中的相关命令
  • 3. coredump调试(附属于gdb调试中一种,当程序出现错误时,会使用coredump调试)
    • 1)coredump是什么?
    • 2)前期设置
    • 3)什么情况下会导致程序异常退出
    • 4)如何调试
  • 4.gdb调试-直接打印堆栈信息

1. 启动gdb

  1. 注意:
    如果系统没有安装gdb ,可以体验使用源码安装的方式来安装:
    • wget http://ftp.gnu.org/gnu/gdb/gdb-8.1.1.tar.gz
    • tar -zxvf gdb-8.1.1.tar.gz
    • cd gdb-8.1.1
    • ./configure
    • make
    • make install

如何判断自己的虚拟机gdb安装成功?
要判断您的虚拟机上的GDB是否已成功安装,可以按照以下步骤进行操作:

1)打开终端并运行gdb命令。您可以通过在终端中输入“gdb”并按Enter键来执行此操作。如果GDB已正确安装,则应该看到一些有关GDB版本和版权信息的输出。否则,您可能需要重新安装GDB或查看安装日志以查找错误。在这里插入图片描述

2)检查GDB的版本。您可以使用“gdb --version”命令来检查GDB的版本。如果GDB已正确安装,则应该看到有关版本号和版权信息的输出。在这里插入图片描述

3)在GDB中运行测试程序。您可以从终端中运行GDB,并使用GDB来调试一个简单的测试程序,例如“Hello World”程序。如果您能够成功启动程序并在GDB中设置断点和调试步骤,则说明您的GDB已正确安装并可以正常使用。
eg:使用gdb来调试hello.c

#include<stdio.h>
int main(){
   printf("Hello World!\n");
   return 0;
}
wxn@WXNNB:~/projects/test$ gcc -g hello.c  -o hello
wxn@WXNNB:~/projects/test$ gdb hello
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from hello...done.
(gdb) break main
Breakpoint 1 at 0x400531: file hello.c, line 3.
(gdb) run
Starting program: /home/wxn/projects/test/hello 

Breakpoint 1, main () at hello.c:3
3           printf("Hello World!\n");
(gdb) continue
Continuing.
Hello World!
[Inferior 1 (process 56541) exited normally]
(gdb) next
The program is not being run.
(gdb) quit

在上述示例中,我们首先使用gcc编译hello.c并生成可执行文件hello,然后使用gdb启动可执行文件。接着我们使用“break main”命令在主函数入口处设置断点,并使用“run”命令启动程序。程序执行到断点处时暂停执行,并且我们可以使用“next”命令逐行执行程序,还可以使用“print”命令查看变量的值。我们还使用“continue”命令继续执行程序。最后,我们使用“quit”命令退出gdb。

gdb调试命令中,continue与next的区别?
区别在于continue命令会一直运行程序直到遇到断点或程序结束,而next命令会逐行执行程序并将控制权移动到下一行

  1. 使用gdb的前提:编译时加上-g参数
$ gcc -g hello.c  -o hello      
  1. 启动gdb 调试:
$ gdb hello      

2.gdb中的相关命令

  1. 设置断点
  • 在某一行设置断点。

break 10

  • 在某个函数的入口处设置断点。

break main

  • 条件断点。

break 10 if i == 10

  • 临时断点。
    您可以使用“tbreak”命令设置临时断点,以便在程序执行到该断点时暂停,但一旦程序继续执行到下一个断点或程序结束时,该断点就会自动删除。例如,如果要在源代码的第20行上设置临时断点,则可以使用以下命令:

tbreak 20

  • 使用info break 可以查看断点
  • 使用 clear 可以清除断点
  • 查看断点信息

info break

  • 使用 clear 可以清除断点

clear + 断点行号或已经设置断点的函数名称

在这里插入图片描述

在这里插入图片描述

  1. 运行程序
run
  1. 单步执行
  • 如果想继续运行,可以使用==continue 命令(缩写为 c )==指导 gdb 继续运行程序,直至遇到下一个断点
  • 如果想继续单步执行,可以继续使用 next,也是以使用 step (缩写为 s), step 和 next 的最大的区别在于,step 遇到函数是会进入到内部,而next 不会进入内部.
  1. 监视变量

调试程序最基本的需求就是监视变量的值,可以使用 print 命令(缩写为 p) 显示指定变量的值。

如果要时刻监视某个变量的值,那么每次使用 print 就不方便。比较人性化的是,gdb 提供了watch 命令,用于设置另一种断点:“观察点”
用法是: watch 变量名或表达式作为参数,一但值发生变化,就停下来。

  1. 临时修改变量
    当某些特殊情况下,我们想让程序进入一些特殊的流程时,gdb允许用户在程序运行时改变变量的值,通过 set var 命令实现这一点。
    在这里插入图片描述
  2. 查看堆栈情况
    每次程序调用一个函数,函数的地址、参数、函数内部变量都会被压入“栈”(Stack) 中,运行时堆栈信息对于程序员非常重要,使用 “bt”命令可以看到当前运行时栈的情况
    在这里插入图片描述
  3. 退出 gdb
    调试完毕,使用quit命令(缩写为q) 退出 gdb程序。

3. coredump调试(附属于gdb调试中一种,当程序出现错误时,会使用coredump调试)

1)coredump是什么?

程序异常退出时,会产生一个core文件,该文件记录了程序运行时的内存,
寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们
可以理解为是程序工作当前状态存储生成的一个文件,通过工具分析这个文
件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题
所在并进行及时解决。

2)前期设置

  1. 设置core文件生成的目录,其中%e表示程序文件名,%p表示进程ID,
    否则会在程序的当前目录生成dore文件;
 echo /data/coredump/core.%e.%p >/proc/sys/kernel/core_pattern 
 cat /proc/sys/kernel/core_pattern 

在这里插入图片描述

注意:根目录(/)
在执行以上命令时,要先确保/data/coredump/目录存在,
可以执行ls -la /data/coredump/查看,如果没有请创建
在这里插入图片描述

  1. 当前执行程序的用户对core目录有写权限且有足够的空间存储core文件;
直接sudo su,在root权限下执行,然后给个666权限
cd /data
sudo chmod 666 coredump/

在这里插入图片描述

  1. 生成不受限制的core文件;
ulimit  -c unlimited
然后使用 ulimit -a 再去查看core文件大小限制

在这里插入图片描述

3)什么情况下会导致程序异常退出

非法指针的访问,堆栈溢出 , 访问越界

4)如何调试

来一个访问空指针的例子:
hello1.c
#include <stdio.h>
int fun(int *p)
{
        int y = *p;
            return y;
}
int main(){
        int *p = NULL;
        return fun(p);
}
  1. 编译的时候添加-g选项,增加调试信息

这里再强调一下,必须是root权限!!!

gcc hello1.c -g -o hello1 
  1. 执行
./hello1

在这里插入图片描述
再使用ls -la /data/coredump/查看一下core文件是否生成在我们配置的/data/coredump/文件夹下:
在这里插入图片描述
红框圈住的一条信息就是我们刚才生成的!!!

同时date命令也可以查看当前时间,查看一下时间是否和上面新生的core文件时间接近
在这里插入图片描述

  1. gdb program core_file
-program :可执行文件
-core_file :新生成的core信息
对应到我的虚拟机是:
gdb hello1 /data/coredump/core.hello1.65606

在这里插入图片描述

frame <n> 
    f <n> 
        n是一个从0开始的整数,是栈中的层编号。
比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
info frame 
   info f 
       这个命令会打印出更为详细的当前栈层的信息,
       只不过,大多数都是运行时的内内地址。
       比如:函数地址,调用函数的地址,被调用函数的地址,
       目前的函数是由什么样的程序语言写成的、函数参数地址及值、
       局部变量的地址等等。如:

在这里插入图片描述

info args
        打印出当前函数的参数名及其值。
     
info locals
        打印出当前函数中所有局部变量及其值。
所有的调试信息:
root@WXNNB:/home/wxn/projects/test# gdb hello1 /data/coredump/core.hello1.65606 
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from hello1...done.
[New LWP 65606]
Core was generated by `./hello1'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000004004f9 in fun (p=0x0) at hello1.c:4
4               int y = *p;
(gdb) bt
#0  0x00000000004004f9 in fun (p=0x0) at hello1.c:4
#1  0x000000000040051f in main () at hello1.c:9
(gdb) where
#0  0x00000000004004f9 in fun (p=0x0) at hello1.c:4
#1  0x000000000040051f in main () at hello1.c:9
(gdb) frame 0
#0  0x00000000004004f9 in fun (p=0x0) at hello1.c:4
4               int y = *p;
(gdb) frame 1
#1  0x000000000040051f in main () at hello1.c:9
9               return fun(p);
(gdb) info f 
Stack level 1, frame at 0x7fff09d7eb20:
 rip = 0x40051f in main (hello1.c:9); saved rip = 0x7f5d96837f45
 caller of frame at 0x7fff09d7eb00
 source language c.
 Arglist at 0x7fff09d7eb10, args: 
 Locals at 0x7fff09d7eb10, Previous frame's sp is 0x7fff09d7eb20
 Saved registers:
  rbp at 0x7fff09d7eb10, rip at 0x7fff09d7eb18
(gdb) info args
No arguments.
(gdb) info locals
p = 0x0

4.gdb调试-直接打印堆栈信息

#include <stdio.h>
#include <signal.h>
//信号钩子函数,获取栈信息,然后在日志中打印
void handle_segv(int signum)
{
    void *array[100];//指针数组
    size_t size;//大小
    char **strings;//二级指针
    size_t i;//计数

    signal(signum, SIG_DFL); /* 还原默认的信号处理handler */

    size = backtrace (array, 100);
    strings = (char **)backtrace_symbols (array, size);

    fprintf(stderr,"Launcher received SIG: %d Stack trace:\n", signum);
    for (i = 0; i < size; i++)
    {
        fprintf(stderr,"%d %s \n",i,strings[i]);
    }

    free (strings);
}
int fun(int *p)
{
        int y = *p;
        return y;
}
int main(){
        int *p = NULL;
        signal(SIGSEGV, handle_segv); // SIGSEGV    11       Core Invalid memory reference
        signal(SIGABRT, handle_segv); // SIGABRT     6       Core Abort signal from
        return fun(p);
}
root@WXNNB:/home/wxn/projects/test# vim hello2.c 
root@WXNNB:/home/wxn/projects/test# gcc -g hello2.c -o hello2
hello2.c: In function ‘handle_segv’:
hello2.c:14:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
     strings = (char **)backtrace_symbols (array, size);
               ^
hello2.c:19:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘size_t’ [-Wformat=]
         fprintf(stderr,"%d %s \n",i,strings[i]);
         ^
hello2.c:22:5: warning: incompatible implicit declaration of built-in function ‘free’ [enabled by default]
     free (strings);
     ^

root@WXNNB:/home/wxn/projects/test# ./hello2 
Launcher received SIG: 11 Stack trace:
0 ./hello2() [0x4006e9] 
1 /lib/x86_64-linux-gnu/libc.so.6(+0x36cb0) [0x7fe46bddfcb0] 
2 ./hello2() [0x4007b6] 
3 ./hello2() [0x4007fa] 
4 /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7fe46bdcaf45] 
5 ./hello2() [0x4005e9] 
段错误 (核心已转储)

使用addr2line命令检测:
addr2line -a 0x4006e9 -e hello2

root@WXNNB:/home/wxn/projects/test# addr2line -a 0x4006e9 -e hello2
0x00000000004006e9
/home/wxn/projects/test/hello2.c:13

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/23915.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

word打印为pdf去掉批注和修订记录

对于这个问题某乎上充斥着垃圾回答&#xff0c;大多引流到自家开发的pdf产品上。其实背后的方法都是一样的&#xff0c;就是关掉批注&#xff0c;用word自带的功能就能解决&#xff0c;凡是word编辑软件都有类似功能 直接用word打印为pdf后的效果 下图为打印出来的pdf文件&…

【算法】不使用LinkedHashMap实现一个LRU缓存

文章目录 什么是LRU&#xff1f;设计思路代码实现 LRU是我在面试过程中遇到的比较多的算法题了&#xff0c;并且我自己的项目中也手写了LRU算法&#xff0c;所以觉得还是有必要掌握一下这个重要的算法的。 什么是LRU&#xff1f; LRU是一种缓存淘汰策略。 我们知道&#xff0…

大环境不好难找工作?三面阿里,幸好做足了准备,已拿offer

大环境不好难找工作&#xff1f;三面阿里&#xff0c;幸好做足了准备&#xff0c;已拿offer 三面大概九十分钟&#xff0c;问的东西很全面&#xff0c;需要做充足准备&#xff0c;就是除了概念以外问的有点懵逼了&#xff08;呜呜呜&#xff09;。回来之后把这些题目做了一个分…

R-Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合实践与拓展

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

增强型本地文件搜索工具:Find Any File

Find Any File是mac上一款增强型本地文件搜索工具&#xff0c;可以让你在本地磁盘上搜索、查找任何文件&#xff0c;包括本地磁盘的名称、 创建或修改日期、 大小或类型和创建者代码等。小编现为大家提供最新Find Any File Mac破解版&#xff0c;欢迎需要的朋友下载使用。 Find…

屏幕挂灯是不是智商税?明基ScreenBar Halo屏幕挂灯初体验

目录 一、屏幕挂灯是不是智商税&#xff1f;二、文心一言眼里的屏幕挂灯1、明基ScreenBar Halo屏幕挂灯2、屏幕挂灯和普通台灯哪个好&#xff1f; 三、屏幕挂灯初体验四、使用体验五、无线控制器六、专业角度分析1、屏幕工作照明&#xff0c;不是随便一盏灯就可以2、引导光线照…

路径规划算法:基于入侵杂草优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于入侵杂草优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于入侵杂草优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

【SA8295P 源码分析】03 - SA8295P QNX Host 上电开机流程分析

【SA8295P 源码分析】03 - SA8295P QNX Host上电开机流程分析 一、阶段1 固件开机自检 (SM BIST)&#xff1a;APPS PBL加载XBL后触发 INT_RESET进行Warm Reset二、阶段2 固件开机自检 (SM BIST)&#xff1a;加载TZ&#xff0c;初始Hypervisor&#xff0c;启动QNX Kernel&#x…

Flume实践

1 NetCat方式 ]# ./bin/flume-ng agent --conf conf--conf-file ./conf/flume_netcat.conf --name a1 -Dflume.root.loggerINFO,console [rootmaster ~]# yum -y intalll telnet 发数据&#xff1a; ]# telnet master 44444 数据接收&#xff0c;是在终端上接收的&#xff0…

从组件化角度聊聊设计工程化

目录 设计系统 设计系统的定义 设计系统的优势 设计系统存在的问题 设计工程化 设计系统探索 设计系统落地实践 Design Token Design Token 实践 设计工程化理想方案构想 展望 参考文献 近几年围绕业务中台化的场景&#xff0c;涌现出了许多低代码平台。面对多组件…

Qt翻金币小游戏详细教程(内涵所有源码、图片资源)

一、项目简介 翻金币项目是一款经典的益智类游戏&#xff0c;我们需要将金币都翻成同色&#xff0c;才视为胜利。首先&#xff0c;开始界面如下&#xff1a; 点击start按钮&#xff0c;进入下层界面&#xff0c;选择关卡&#xff1a; 在这里我们设立了20个关卡供玩家选择&…

Jmeter组件:Random CSV Data Set Config(随机读取文件数据)

一、Jmeter组件&#xff1a;Random CSV Data Set Config(随机读取文件数据) 功能&#xff1a;该组件可以随机读取CSV文件中的每一行的数据 二、下载插件&#xff1a;(jmeter-plugins-random-csv-data-set-xx.jar),并放到lib/ext目录下&#xff0c;重启jmeter 也可以在Jmeter…

Nginx基本使用以及部署前端项目

前言 最近学习了一下Nginx&#xff0c;整理了一个博客&#xff0c;主要参考的是狂神说的b站视频教程&#xff0c;文章链接如下&#xff1a;狂神说Nginx快速入门 一、下载、启动Nginx 1.下载Nginx 到Nginx官方选择自己电脑适用的稳定版本下载&#xff0c;我下载的的windows版…

ChatGPT免费使用的方法有哪些?

目录 一、ChatGpt是什么&#xff1f; 二、ChatGPT国内免费使用的方法&#xff1a; 第一点&#xff1a;电脑端 第二点&#xff1a;手机端 三、结语&#xff1a; 一、ChatGpt是什么&#xff1f; ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

图像算法工程师岗位的主要职责(合集)

图像算法工程师岗位的主要职责 一、确定岗位的职责 1.根据工作任务的需要确立工作岗位名称及其数量; 2.根据岗位工种确定岗位职务范围; 3.根据工种性质确定岗位使用的设备、工具、工作质量和效率; 4.明确岗位环境和确定岗位任职资格; 5.确定各个岗位之间的相互关系; 6.根据岗位…

Solidity基础七

无论风暴将我带到什么岸边&#xff0c;我都将以主人的身份上岸 目录 一、Solidity的单位 1. 货币Ether 2. 时间单位Time 二、地址的形成 三、以太坊的账户 1.内部账户&#xff08;简称CA&#xff09; 2.外部账户&#xff08;简称EOA&#xff09; 3.内部账户和外部账户…

【Linux性能优化】你知道什么是平衡负载么

什么是平衡负载 首先大家思考一下&#xff0c;当你发现自己的服务变慢时&#xff0c;你会首先使用什么命令来排查&#xff1f;我通常做的第一件事&#xff0c;就是执行top或者uptime命令来了解系统的负载情况。比如像下面这样&#xff0c;我在命令行里输入top命令&#xff0c;…

[高光谱]使用PyTorch的dataloader加载高光谱数据

本文实验的部分代码参考 Hyperspectral-Classificationhttps://github.com/eecn/Hyperspectral-Classification如果对dataloader的工作原理不太清楚可以参见 [Pytorch]DataSet和DataLoader逐句详解https://blog.csdn.net/weixin_37878740/article/details/129350390?spm1001…

网络货运平台源码 管理平台端+司机端APP+货主端APP源码

网络货运平台系统源码&#xff0c;网络货运平台源码 管理平台端司机端APP货主端APP 遵循政策要求的八项基本功能&#xff0c;结合货主、实际承运人、监管方等多方业务场景&#xff0c;构建人、车、货、企一体的标准化网络货运平台系统。具有信息发布、线上交易、全程监控、金融…

数据库基础——6.排序与分页

这篇文章来讲一下数据库的排序与分页 目录 1.排序数据 1.1排序规则 1.2 单列排序 1.3 多列排序 2.分页 2.1 背景 2.2 实现规则 2.3 拓展 1.排序数据 1.1排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;&#xff1a;升序 &#xff1b; DESC&a…
最新文章