gdb调试 与 coredump

news2024/12/24 9:14:09

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.coloradmin.cn/o/568374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE进阶5/25

1.五大类注解详解&#xff08;重点 1.Controller 控制器&#xff0c;用于业务逻辑层&#xff0c;来控制用户的行为。它用来检查用户参数的有效性。 当用户的参数有效的话会继续分发到服务层。controller可以理解为程序的安保系统 2.Service 服务层。归属服务层&#xff0c;调用…

MySQL---SQL优化上(explain分析执行计划、查看SQL的执行效率、定位低效率SQL)

1. 查看SQL的执行效率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当前数据库的主要操作类型。 --下面的命令显示了当前 session 中所有统计参数的值 show session status like Com____…

【滴水逆向P77】加载进程(PE查看器)应用程序源码解析

在上一篇文章中讲解了通用控件&#xff0c;做了一个基本的加载进程&#xff08;PE查看器&#xff09;的应用程序项目&#xff0c;Win32通用控件&#xff0c;加载进程&#xff08;PE查看器&#xff09;项目初步&#xff0c;大家如果有不懂的可以去看看&#xff0c;由于不是很了解…

如何搭建一个高效、可靠的积分商城系统?

互联网购物的普及&#xff0c;积分商城系统已经成为商家和消费者之间互动的一种常见方式。它不仅可以帮助商家增加品牌影响力&#xff0c;还可以提高顾客体验&#xff0c;从而增加销售额。下面就如何搭建一个高效、可靠的积分商城系统作一些简单介绍。 第一步&#xff1a;确定需…

MyBatis源码学习三之查询主逻辑

MyBatis源码学习三之查询主逻辑 继续上一章节。 MyBatis的一个主要流程图。从图中可以看出&#xff0c;核心的东西主要集中在3个Handler中。分别是入参处理&#xff0c;执行sql语句处理&#xff0c;以及返回结果处理。 一 实例 Test public static void main(String[] args…

Revit建模|10种方法帮你解决Revit操作卡顿!

大家好&#xff0c;这里是建模助手。 相信各位BIMer在使用Revit建模时&#xff0c;肯定遇到过软件加载慢或者程序未响应的现象。我们经过测试发现&#xff0c;除了硬件配置及软件本身的问题以外&#xff0c;建模习惯及软件使用方法不当也会造成软件卡顿。 以下就是我们总结的…

TPlinker解读

参考&#xff1a; 关系抽取之TPLinker解读加源码分析 TPLinker 实体关系抽取代码解读 实体关系联合抽取&#xff1a;TPlinker TPLinker中文注释版 Tagging TPLinker模型需要对关系三元组(subject, relation, object)进行手动Tagging&#xff0c;过程分为三部分&#xff1a; &…

阿里面试,HR说我不配21K,直接翻脸.....

好家伙&#xff0c;这奇葩事可真是多&#xff0c;前两天和粉丝聊天&#xff0c;他说前段时间面试阿里的测开岗&#xff0c;最后和面试官干起来了。 我问他为什么&#xff0c;他说没啥&#xff0c;就觉得面试官太装了&#xff0c;我说要21K&#xff0c;他说太高了&#xff0c;说…

【全国产龙芯平台】迅为iTOP-LS3A5000_7A2000开发板+银河麒麟操作系统

硬件准备 1.M.2.ssd硬盘&#xff08;最好大于等于128G&#xff09;&#xff1b; 2.迅为LS3A5000开发板&#xff1b; 3.U盘&#xff08;需大于8g&#xff09;&#xff0c;制作启动盘使用&#xff1b; 4.hdmi显示器&#xff1b; 5.搭载linux环境的计算机。 安装步骤 1 制作…

【多线程】两阶段终止模式

目录 一、两阶段终止模式说明二、错误思路三、实现思路图四、实现思路五、方法说明六、interrupt实现6.1 代码示例6.2 示例截图 七、volatile实现7.1 代码示例7.2 示例截图 一、两阶段终止模式说明 1.在一个线程t1中优雅地终止另一个线程t2&#xff0c;指终止t2线程前&#xff…

【C++】位图/布隆过滤器+海量数据处理

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C 文章目录 前言一 位图1.位图法介绍2.位图实现的细节 二、布隆过滤器1.布隆过滤器概念2.布隆过滤器实现 三、海量数据处理1. 位图应用2. 哈希切割3. 布隆过滤器 前言 题目 给40亿个不重复的无符号整数&#xff0c;没…

Java

FileOutputStream写数据的3种方式 void write(int b) //一次写一个字节的数据 void write(byte[] b) //一次写一个字节数组数据 void write(byte[] b, int off,int len) //一次写一个字节数组的部分数据 参数一:数组;参数二:起始索引 0;参数三:个数换行: windows:“\r\n” lin…

springboot+java小区社区宽带安装管理系统

本次程序软件的开发的目的就是让使用者可以通过使用该软件提高信息数据的管理效率&#xff0c;同时该程序软件也需要针对不同的操作用户设置对应的功能&#xff0c;因此&#xff0c;此程序的操作流程应该尽量与用户日常操作软件的行为习惯相贴合&#xff0c;另外&#xff0c;程…

分享最强国内免费ChatGPT的镜像网站,记得收藏(2023年更新中)

众所周知的原因&#xff0c;要想在国内使用ChatGPT&#xff0c;肯定是要“折腾一番”的。但是对于绝大多数普通小白&#xff0c;有没有比较容易的方法就用上官方的ChatGPT呢&#xff1f;答案是肯定的&#xff0c;下面就给大家分享几个2023年我正在使用的ChatGPT镜像网址&#x…

Python入门学习

一、执行Python&#xff08;Hello World&#xff09;程序 对于大多数程序语言&#xff0c;第一个入门编程代码便是 “Hello World&#xff01;”&#xff0c;以下代码为使用 Python 输出 “Hello World&#xff01;” 1.1 创建hello.py文件 1.2 编写程序 #!/usr/bin/python…

听我一句劝,别去外包,干了五年,废了....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近5年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了5年的功能测试…

Gateway网关参数进行验签POST 包含requestbody 请求体封装

Gateway网关自定义拦截器的不可重复读取数据 特别注意一点, 因为在网关层 拿出 request 流之后,必须重写getbody()方法把所有的参数放进去,否则后面转发的请求无法接收到任何数据, 坑,巨坑,因为版本问题网上很多都不能兼容, 我的springboot环境 依赖包 <parent><gr…

Linux--ServerProgramming--TCP\IP协议族

1.TCP/IP 协议族 1.1 TCP/IP协议族及主要协议 TCP/IP 协议族是一个四层协议系统。自上而下为&#xff08;如下图所示&#xff09;&#xff1a;应用层传输层网络层数据链路层 应用层负责处理应用程序逻辑&#xff0c;在用户空间实现。&#xff08;少数服务器程序在内核中实现。…

如何下载外文期刊文献,怎么下载又快又省力!

文章开头我们先了解一下下面这些查找外文期刊文献的数据库: 1、Web of Science&#xff1a;是获取全球学术信息的重要数据库。它收录了全球13000多种权威的、高影响力的学术期刊&#xff0c;内容涵盖自然科学、工程技术、生物医学、社会科学、艺术与人文等领域。其中以SCIE、S…

OpenCV入门简单的人脸识别项目

在学会图像处理和打开摄像头获取视频流后&#xff0c;就可以开展简单的人脸识别项目。 文章目录 检测人脸区域并绘制矩形多个人脸进行识别绘制五官位置视频检测人脸人脸识别 人脸识别首先需要检测到人脸。 检测人脸区域并绘制矩形 # 加载图片img face_recognition.load_image…