如何使用gdb调试java虚拟机_GDB入门教程之如何使用GDB启动调试

2023-10-29

GDB (The GNU Project Debugger)是 Linux 系统下调试 C 和 C++ 程序的主要神兵。Vim教程网(https://vimjc.com)介绍多种方式下使用 GDB 启动进程调试的方法和命令。

要使得 C 和 C++ 程序能在 GDB 下正常进行调试,必须在程序编译期间把基本的调试信息(如变量名、函数名、函数调用堆栈等)添加到可执行文件中。gcc、cc、g++ 等编译器可通过编译参数 -g 指定添加调试信息。

当使用 GDB 加载不包含调试信息的二进制文件或进程时,GDB终端会提示错误信息:”no debugging symbols found”。

一、GDB调试未执行程序

对于本地的某个二进制文件 demo ( GDB 也支持远程调试),若其启动时不需要命令行参数,则可以在shell下使用命令 gdb demo 进入 GDB,并输入 run (缩写形式 r) 启动对demo的调试。

若 demo 程序启动时需要命令行参数,则可以在使用 gdb demo 命令进入 GDB 后,使用命令 run arg1 arg2... 提供命令行参数并启动对 demo 程序的调试。

bea4a36c11db7457b1998e54d6126d0f.gif

二、GDB调试运行中程序

使用 GDB 调试正在运行的程序时,必须先找到该程序运行在操作系统中的进程号 (PID)。可以使用 Linux 命令 ps ef | grep -w demo、 ps aux | grep -w demo 或 pidof demo 获取到 demo 进程当前的进程号。

获取到待调试的目标进程号后 (假设为 pid ),可以使用 gdb 命令进入 GDB 终端,并使用 attach pid 的方式启动对当前正在运行的 demo 进程的 GDB 调试。

也可以使用 gdb -p pid 命令直接进入 GDB 并启动对该进程的调试。

对于使用多线程模式的进程,可以在 GDB 中使用 info threads 命令显示当前进程中所有线程的基本调试信息,包括:GDB 分配的线程ID、线程堆栈等。线程列表中,GDB 线程 ID 左侧的 * 表示当前真正被调试的线程。

可通过 thread tid 命令切换和启动对 GDB 线程号为 tid 的线程进行调试。关于使用 GDB 调试多进程和多线程,后续会有独立的文章进行详细介绍。

7be22d3db65d5c1d7f1073d20475f805.gif

三、GDB调试core文件

当程序在 Linux 系统下发生异常崩溃(如段错误)时,内核会将该应用程序在崩溃发生时的内存数据、程序调用堆栈等核心信息转存到磁盘,这种功能称之为 core dump,中文可翻译为 核心转储。

core dump 是程序异常退出时的内存快照,是异常发生后对程序进行现场还原和故障排查的关键线索。Linux 进程 core 掉可以说是所有 C 和 C++ 程序员接触最频繁而又最不想碰到的问题。

可通过 ulimit -c 查看和指定 core 文件的大小,通过修改 /proc/sys/kernel/core_pattern 文件可指定 core 文件保存在本地磁盘中的路径和文件名格式。

GDB 对 core 文件的分析和调试提供了非常强大的功能支持,可使用 gdb demo/data/core/xxx 启动对 demo 进程某次产生的core文件 /data/core/xxx 的分析和调试,也可以使用 gdb -c /data/core/xxx 加载和分析 core 文件。

GDB 正常加载 core 文件后,便可以使用 backtrace (缩写形式 bt) 显示程序异常退出时刻的函数堆栈情况,再使用 frame、 print、 up、 down、 where 等命令对异常现场进行详细分析。

为了让程序产生 dump ,将 demo.cpp 中的输出语句 printf("%s: %d\n",(char*)ptr,array[i]); 改成 printf("%s: %s\n",(char*)ptr,array[i]); 后在编译时加入 -w 参数忽略掉警告后重新生成 demo 可执行文件。

553ff18efc9cece99b69bea99299ebdc.gif

关于 GDB 调试程序和 core 文件的具体方法和命令,请关注Vim教程网(https://vimjc.com)后续 GDB 系列的后续文章。

PS:使用 quit (缩写形式 q) 可退出 GDB。

转自:https://vimjc.com/debug-program-with-gdb.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用gdb调试java虚拟机_GDB入门教程之如何使用GDB启动调试 的相关文章

  • RabbitMQ入门------Java

    RabbitMQ RabbitMQ是一个开源的AMQP实现 服务器端用Erlang语言编写 支持多种客户端 如 Python Ruby NET Java JMS C PHP ActionScript XMPP STOMP等 支持AJAX 用
  • sql计算占比

    计算占比是日常分析中常见的需求 下面我们来小结一下怎么用sql来实现计算占比 1 数据准备 现在有一张表 表里有两个字段 op name与state 都为离散型可枚举数据 除此以外表里还有其他字段 数据形式如下 op name state
  • Neo4j Desktop数据导出,导入Neo4j Community (Docker环境)

    目前课题组有基于Kubernetes和Dockers的集群以及阿里云镜像托管仓库 我们以往建立的知识图谱都是在本机有数据备份 怎么将他们导出到集群环境的Neo4j中呢 本机数据导出 Neo4j Desktop提供很多功能 但是一键导出功能根
  • VMware虚拟机设置网络

    https jingyan baidu com article f0e83a257beae322e591013d html
  • JS中int和string的转换

    在javascript里怎么样才能把int型转换成string型 1 var x 100 a x toString 2 var x 100 a x JS会自动隐性转换 javascript 将string 变成 int JScript va
  • 列表查询和分组统计字段其他类型

    示例 列表查询 字段单选
  • 分支循环练习篇

    选择题第一部分练习 1 2 3 4 5 6 答案 cccddd 选择题第二部分练习 1 2 答案 bc 代码练习第一部分 1 2 3 4 5 使用试除法 ps 用到了新的库函数sqrt 开方 代码练习第二部分 1 2 老师写法 我的写法 3
  • PhpStorm同时编辑多行

    看到这张图基本就都明白了
  • HIT-ICS大作业

    计算机系统大作业 题目 程序人生 Hello s P2P 计算机科学与技术学院 摘 要 大作业题为程序人生 Hello s P2P 围绕一个较简单的hello c函数的整个生命周期展开 介绍了该示例程序从编写到执行到结束的全过程 详细地分析
  • 【Unity API】Input类

    Input类函数是游戏输入系统的接口 使用此类函数可以读取游戏输入设置中的虚轴 以及访问移动设备上的多点触摸或加速度计数据 关于 游戏输入设置 可以看到我的另一篇文章 https blog csdn net Ha1f Awake artic
  • javafx写一个小游戏-井字棋

    学了几天的javafx 感觉非常好用 自己写了一个小游戏 如有不足 希望大佬加以指正 谢谢 1 先写UI界面 新建一个ui fxml文件 用于显示ui界面 界面效果如下 代码如下
  • Java 去除重复数据的五种方式

    1 使用LinkedHashSet删除arraylist中的重复数据 LinkedHashSet是在一个ArrayList删除重复数据的最佳方法 LinkedHashSet在内部完成两件事 删除重复数据 保持添加到其中的数据的顺序 Java
  • 从数据库中随机抽取一条记录的SQL语句

    我们经常想在一个数据表中随机地选取出数据来 比如随机生成考试试卷等 利用 SQL Server 的 NewID 方法就可以很轻松地达到这个目的 NewID 方法返回一个 GUID 如 EE95A489 B721 4E8A 8171 3CA8
  • Java8 lambda 表达式 forEach 如何提前终止?

    首先 让我们看一下Java 8中如何使用forEach 方法 forEach 方法接受一个Consumer接口作为参数 该接口定义了一个accept 方法 该方法接受一个对象并对其执行一些操作 因此 我们可以通过Lambda表达式来实现Co
  • RC滤波器

    前阶段 因项目解干扰问题 和同事聊起来RC滤波 所以 今日借此机会 通过文章的方式再一次给大家简单的普及一下RC滤波的知识 关于滤波 其目的还是为了尽可能多的让有用信号做到无衰减 无用信号衰减至近乎为0 大家知道同时也是接触最多的还属电源端
  • 华为机考秘诀-适用于华为校招机考、OD机考、社招机考、实习机考

    我是一名软件开发培训老师 我的学生已有数百人通过了华为各种机考 我分享的题目也帮助了几百人通过考试 命中率超高 下面我将分享一下机考的秘诀 每一个购买我专栏的同学 可以私聊我 免费提供一些辅导和答疑 1 机考语言的选择 选择Python 首
  • oracle+超出表空间限额,ORA-01536: 超出表空间 'USERS' 的空间限额

    Connected to Oracle Database 10g Enterprise Edition Release 10 2 0 1 0 Connected as SYS SQL gt conn mytest mytest orcl C
  • 【Docker】win10上修改docker的镜像文件存储位置(九)

    2020 12 21 补 Docker win10上修改docker的镜像文件存储位置 九 通过WSL2修改 或 源于评论 根据WSL 2模式的Linux容器 Hyper V模式的Linux容器还是Windows容器 可以使用不同的配置方式
  • python配置opencv、mediapip环境

    1 先安装python再安装pycharm以后 2 网上有的教程是在pycharm下选择虚拟的python环境下创建项目 并在设置中添加安装需要的环境 我使用这个方法opencv安装一直失败 所以选择使用命令行配置 3 环境的安装包路径在下

随机推荐

  • 快手引流需要钱吗?快手免费引流怎么做?

    其实做引流推广无非就是两种方式 付费引流 免费引流 付费引流就比较简单 有钱就行 但是免费引流说的就比较简单 真正执行起来 需要时间去沉淀 很多人就是因为坚持不下来 就认为免费引流不可能成功引流 所以这也是为什么这么多人一直都在找引流方法
  • 每天一个秃头小技巧-github 上找项目

    注 本内容基于韩顺平老师视频 一 watch start fork fork代表分支 分支越多说明喜欢你的项目并在上面开发 二 about topic readme 三 github开源项目搜索 1 找一个基于springboot的项目 i
  • 华为OD机试真题 Java 实现【机房布局】【2023Q1 200分】

    一 题目描述 小明正在规划一个大型数据中心机房 为了使得机柜上的机器都能正常满负荷工作 需要确保在每个机柜边上至少要有一个电箱 为了简化题目 假设这个机房是一整排 M表示机柜 I表示间隔 请你返回这整排机柜 至少需要多少个电箱 如果无解请返
  • termux-x11教程

    小粉丝已经求稿两个星期了 不写是不行了 termux x11 是Termux的一个图形化项目 官方是这么介绍的 A Termux add on app providing Android frontend for Xwayland 安装工具
  • MacBook【m1】创建django虚拟环境

    1 为什么使用虚拟环境 cd miniforge3我们在做开发时可能会同时开发多个项目 这些项目可能会依赖于不同的python环境 比如有的用到3 6有的用到3 7 这时我们创建不同版本的python 放到虚拟环境中给不同的项目分别提供其所
  • ReactJs实现树形结构的数据显示的组件

    1 该组件树形显示数据 2 组件中数据的请求方式为fetch方式 3 点击对应的数据前面的小三角 fetch请求改数据下对应的子数据 并展开该节点 4 将该组件的js less文件放到kpiTree目录下 在kpiTree目录下创建imag
  • Vue 路由

    1 vue router的理解 vue router是vue的一个插件 专门用来实现SPA应用 SPA也就是单页Web应用 特点是 整个应 用只有一个完整的页面 点击页面中的导航链接不会刷新页面 只会做页面的局部更新 数据需要 通过ajax
  • printf打印浮点数,%e %f %g的区别

    打印浮点数有 e f g三种格式 它们的区别如下 e 以科学计数法表示 小数点左边只有一位 小数点右边保留6位 过长则截去 不够则补零 接着是符号e 再接着就是10的多少次幂 f 要求小数点右边保留6位 过长则截去 不够则补零 g 没有上面
  • pandas学习笔记—agg()函数详解

    目录 1 agg 函数定义 2 举例 2 1 简单的列或行统计 2 2 自定义统计函数 2 3 先groupby 再agg 1 agg 函数定义 agg 函数是聚合函数 DataFrame agg func axis 0 args kwar
  • sprintf格式化字符串

    可以利用sprintf对字符串进行格式化 sprintf 目标字符串 格式 占位参数 格式化字符串 void test01 char buf 1024 memset buf 0 1024 sprintf buf 今天是 d年 d月 d 日
  • Failed to start docker.service: Unit not found(Docker服务起不来)

    原文https blog csdn net qq 34508530 article details 84989990 linux部署Docker出现 Failed to start docker service Unit not found
  • 多种方案教你实现iframe嵌套页面相互传参(父子通信)

    文章目录 需求描述 开始上手 上代码 父向子传值 方法一 通过URL传参 方法二 通过window postMessage 方法 注意事项 子向父传值 方法一 通过通过全局变量方式处理 方法二 通过通过window parent postM
  • DVWA-BruteFoce高级安全

    DVWA security high GET包结构 比起来之前low medium等级 可以看到这里多了一个参数 user token 为了防止重放攻击 但是明显能看出来user token就是用户输入密码的md5形式 直接用burpsut
  • 用ChatGPT生成openAI全景报告

    云孚科技基于业内领先的自然语言处理 知识图谱 语义匹配 智能写作等技术 打造了云孚开源情报系统YFINT 并结合ChatGPT模型成果 重磅推出OpenAI调研报告 ChatGPT简介 2022年11月30日 总部位于旧金山的OpenAI推
  • 【13届蓝桥杯复盘】九进制转十进制 顺子日期

    问题描述 九进制正整数 2022 下标9 转换成十进制等于多少 方法 权值展开 2 93 2 9 2 9 0 1478 如果 一定要用代码来实现 C 代码如下所示 include
  • python+selenium实现cookie登录,并抓取指定类class下的html内容

    个人研究学习研究用 1 首先通过链接手动登录 https www educity cn 获取cookie信息 2 再使用站点cookie登录 跳转到https uc educity cn tiku testReport html id 80
  • Hadoop组件的一些总结

    前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构 用户可以在不了解分布式底层细节的情况下 开发分布式程序 充分利用集群的威力进行高速运算和存储 提示 以下是本篇文章正文内容 下面案例可供参考 一 Hadoop的组成 H
  • [转]为什么未来不需要我们?

    为什么未来不需要我们 在21世纪 我们威力无比的三种科技 机器人 基因工程和纳米技术正在使人类成为濒危物种 作者 比尔 乔伊 自从我从事科技创造的那一刻起 我就关注其在伦理上的问题 但直到1998年秋天我才认识到我们在21世纪面临着多大的危
  • python3+flask 开发web(一)

    1 环境准备 1 安装Python https www python org 2 安装python ide pycharm https www jetbrains com pycharm 3 安装flask 安装好了python 电脑就自动
  • 如何使用gdb调试java虚拟机_GDB入门教程之如何使用GDB启动调试

    GDB The GNU Project Debugger 是 Linux 系统下调试 C 和 C 程序的主要神兵 Vim教程网 https vimjc com 介绍多种方式下使用 GDB 启动进程调试的方法和命令 要使得 C 和 C 程序能