首页 > 其他分享 >gdb调试

gdb调试

时间:2024-03-21 11:14:09浏览次数:28  
标签:core coredump 程序 gdb 断点 调试

在开发定位过程中,肯定会用到gdb去跟踪定位分析问题,下面是记录一些常用的命令,方便后续查找。

1:比如我要自己编译一个小程序,然后想用gdb去跟踪,

在GDB下调试一个小程序的基本步骤如下:

           1.编写源代码:

    // hello.c
    #include <stdio.h>
 
    int main() {
        printf("Hello, World!\n");
        return 0;
    }

  1.  

    2.编译源代码,生成可执行文件:想要能用gdb跟进去调试,就需要加上-g

    gcc -g hello.c -o hello

    如果里面有创建线程的,编译的时候需要加上-lpthread,如下:

    gcc -g hello.c -o hello -lpthread

     

    3.使用GDB调试程序:

    gdb hello

    4.在GDB环境中进行调试,例如设置断点、查看变量值等:

    (gdb) break main  # 设置断点在main函数处
    (gdb) run        # 运行程序
    (gdb) print i    # 查看变量i的值(如果程序中有int i;)
    (gdb) quit       # 退出GDB

    以上步骤可以帮助你使用GDB对一个简单的程序进行调试。

     

    5.调试core文件

    Core Dump:Core的意思是内存,Dump的意思是扔出来,堆出来(段错误)。开发和使用Unix程序时,有时程序莫名其妙的down了,却没有任何的提示(有时候会提示core dumped),这时候可以查看一下有没有形如core.进程号的文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考,能够很大程序帮助我们定位问题。那怎么生成Core文件呢?
    生成Core方法

    产生coredump的条件,首先需要确认当前会话的ulimit –c,若为0,则不会产生对应的coredump,需要进行修改和设置。
    即便程序core dump了也不会有core文件留下。我们需要让core文件能够产生,设置core大小为无限:

    ulimit -c unlimited

    更改core dump生成路径

    因为core dump默认会生成在程序的工作目录,但是有些程序存在切换目录的情况,导致core dump生成的路径没有规律,

    所以最好是自己建立一个文件夹,存放生成的core文件。

    我建立一个 /data/coredump 文件夹,在根目录data里的coredump文件夹。
    ————————————————
    调用如下命令:
    echo /data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern

    将更改core文件生成路径,自动放在这个/data/coredump文件夹里。

    %e表示程序名, %p表示进程id

     

    6、关于断点

    可以使用b+文件名+行号,或者指定函数名,可用if限定条件断点。
    使用info breakpoints列出所有断点,使用delete 1删除编号为1的断点。

    break test.c:6

    break test.c:6 if num>0

    b fucntionname
    

    6、关于源代码查看

    list first,last

    list  6, 20  

    显示代码6-20行

     

    7:关于调试多线程程序

    查看当前运行的进程
    ps -aux | grep main

    查看当前运行的轻量级进程
    ps -aL | grep -w main

    查看主线程和新线程的关系
    pstree -p 主线程id


    8:gdb进去怎么打印地址内容

    gdb调试时可以使用以下方式打印变量,

    • print
    • x
    • whatis
    • ptype
    • info



    命令作用
    x/s str 打印字符串str
    set print elements 0 打印不限制字符串长度/或不限制数组长度
    call printf("%s\n", xxx) 这是打印出的字符串不会含有多余的转义字、符
    printf("%s\n", xxx)  

     

     

    link:

    https://blog.csdn.net/weixin_68063596/article/details/132342865     ---- 这个里面介绍的比较全面

    https://zhuanlan.zhihu.com/p/508160353     -----gdb进去,打印地址内容

     

     

标签:core,coredump,程序,gdb,断点,调试
From: https://www.cnblogs.com/beilou310/p/18086875

相关文章

  • GDB
    GDBGDB能够允许查看程序执行时的内部情况,或者在程序出现崩溃的瞬间正在做什么。GDB可以做四种主要的功能来帮助捕获错误:启动程序,指定可能影响其行为的变量或条件使程序在指定条件或者位置停止检查程序停止时发生了什么更改程序中的内容,以便可以尝试更正当前已了解到的错......
  • Win10 通过附加进程调试时出现“此任务要求应用程序具有提升的权限”
    最近有新人在使用vs调试时出现了“此任务要求应用程序具有提升的权限”的提示,每次调试vs就会重启一次。  问到我时,我经过查了一番资料才给解决掉了。其实,问题主要是因为直接启动vs项目时没有足够的权限。下面我就简单说一下个人解决方案:1、在vs快捷键右键属性2、选择->......
  • openwrt上使用emmylua + emmyluadebugger + clion调试luci
    lua-emmyluadebuggerAOpenWrtpackageofEmmyLuaDebuggerIntelliJ-EmmyLuaEmmyLuaDebuggerIntelliJ-EmmyLua是一个给JetBrains全家桶用的lua插件,也有VSCode版本VSCode-EmmyLua插件。EmmyLuaDebugger是配合IntelliJ-EmmyLua使用的remotedebugger,C++编写供lua调用的动态......
  • bash -n -x -v -xv 语法检查 进行调试
    前言全局说明一、-n选项:语法检查脚本写完之后,最为简单的语法检查,比如缺少引号等,夹杂在大量的内容之中就很难定位,这时使用-n参数则可以初略地进行检查二、-x选项:调试如果想知道每步变量在执行时的值和执行的路径,则可以使用-x选项。每一条可执行脚本命令前都会有一个“......
  • 使用Python-psycopg访问postgres、openGauss、MogDB
    摘要Psycopg是一种用于执行SQL语句的PythonAPI,可以为PostgreSQL、GaussDB数据库提供统一访问接口,应用程序可基于它进行数据操作。Psycopg2是对libpq的封装,主要使用C语言实现,既高效又安全。它具有客户端游标和服务器端游标、异步通信和通知、支持“COPYTO/COPYFROM”......
  • 用 Visual Studio 调试器中查看内存中图像
    返回目录:OpenCV系列文章目录(持续更新中......)前一篇:OpenCV4.9.0在windows系统下的安装后一篇:OpenCV-Java开发简介  ​警告本教程可以包含过时的信息。ImageWatch是MicrosoftVisualStudio的插件,可用于在调试应用程序时可视化内存中的图像(例如 cv::Mat 或 IplIma......
  • kanzi快速调试绑定
    kanzi绑定里有很多复杂表达式,难以看出输入值和结果的关系,因为绑定源可能路径复杂,也不易去修改调试。尝试做一个插件,简化调试。1.插件1.1设计思路插件提供属性InputBindText,用于解析绑定内容,提取输入的属性,转为本节点属性。生成新的绑定内容,用于手动绑定。插件相关请......
  • NAND和NOR Flash 完全应用笔记(应用调试篇)
    本文要点:给出了华为三星及英特尔的常用FLASH参考电路;结合datasheet解说2bit以及4bit的NANDFLASH;调试思路总结以及简单的调试经验分享;最新的3DXpoint技术介绍。首先,我要用这张图来说明存储器近70年的发展历程,纵观这70年的发展,可以发现主要是在容量,速度以及寿命等方面......
  • Debug环境配置能编译、调试,而 Release 却不能编译,找不到opencv_world480d.lib,我的解决
    这个问题弄了好久,网上的查看了N多资料,看来问题各不相同,总是弄不好。终于弄好,总结如下几点:1、弄清楚版本号,我用的是VS2017,对应的应该是VC15。opencv_world480d.lib对应的opencv估计是不支持,其目录中只有一个VC16,奇怪的是DEBUG模式认这个手动,将opencv下的VC16改为VC15,......
  • CSS样式表和调试工具及语法及符合选择器
    注:CSS样式表,chrome调试工具,Emmet语法,css符合选择器一.样式表按照CSS样式书写的位置(或者引入的方式),CSS样式表可以分为三大类:1.行内样式表(行内式)行内样式表(内联样式表)是在元素标签内部的style属性中设定CSS样式。适合于修改简单样式。语法:<divstyle="color......