玩转C++调试之Python的GDB库增强

news2024/12/29 11:28:40

玩转C++调试之Python的GDB库增强

0.导语

调试是软件开发过程中不可或缺的一环,而GDB(GNU调试器)作为一款功能强大的调试工具,在开发者中得到广泛应用。除了传统的命令行调试功能外,GDB还提供了Python的GDB库,允许开发者使用Python语言扩展和增强调试的能力。本文将介绍如何在GDB中使用Python的GDB库,展示其强大的调试功能和用例。

开始之前,确保已经正确安装Python和GDB,并且Python版本与GDB兼容。然后,按照以下步骤安装Python的GDB库:

a. 在命令行中执行gdb打开GDB。

b. 输入python命令,进入GDB的Python解释器。

c. 执行import gdb,如果没有报错,说明Python的GDB库已经正确安装。

(gdb) python
>import gdb
>end

gdb调试过程中我们通常想查看一些复杂结构变量,例如PostgreSQL中的List结构,啥都能往里面放,里面具体是啥真不好直观打印出来,此时在我们日常开发中就有了python脚本,下面示例:

(gdb) pgprint tl
TargetEntry [resno=1 resname="sum"]
	Aggref [aggfnoid=2107 aggtype=1700 aggtranstype=2281 aggstar=false aggvariadic=false aggkind=110 'n' agglevelsup=0 aggsplit=AGGSPLIT_FINAL_DESERIAL aggno=0 aggtransno=0 agg_expr_id=0]

1.Hello python gdb

我们可以在gdb中执行一些python操作,例如:print,如下所示:

scssCopy code
(gdb) python
> print(1+2)
> end
3
(gdb) end
This command cannot be used at the top level.

在这个示例中,我们进入GDB的Python解释器,并执行了一个简单的Python语句print(1+2),结果为3。

另一个例子是我们可以直接输入python xxxx来运行。

scssCopy code
(gdb) python f = 2
(gdb) python print(f)
2

在这个示例中,我们在GDB中使用Python语句定义了一个变量f,并打印了它的值,结果为2。

2.实战:如何编写?

核心点在于我们如何编写这些脚本?通过这个脚本来方便打印出自己代码,下面是实战环节,关于本节的相关代码与资料将会更新在星球中,欢迎关注:

f6fcec323e2151f46f4c16279fca1288.jpeg

struct Point {
    int x;
    int y;
};

现在有一个Point结构体,我想通过脚本打印出来,如何实现呢?

逻辑非常简单,读取结构体,然后print即可。

import gdb

def print_point(point):
    print(f"Point: x={point['x']}, y={point['y']}")

def print_person(person):
    age = person['age']
    print(f"Person: age={age}")

class PrintCppStruct(gdb.Command):
    def __init__(self):
        super(PrintCppStruct, self).__init__("print_cpp_struct", gdb.COMMAND_USER)

    def invoke(self, arg, from_tty):
        try:
            cl = gdb.parse_and_eval(arg)
            if cl.type.code == gdb.TYPE_CODE_STRUCT and str(cl.type) == 'Point':
                print_point(cl)
            elif cl.type.code == gdb.TYPE_CODE_STRUCT and str(cl.type) == 'Person':
                print_person(cl)
            else:
                print("Unknown C++ structure type.")
        except gdb.error as e:
            print(f"Error: {e}")

PrintCppStruct()

如何使用?

只需要source即可:

(gdb) source print.py

在这个示例中,我们通过source命令在GDB中加载了一个名为print.py的Python脚本。

(gdb) print_cpp_struct myPoint
Point: x=10, y=20

在这个示例中,我们在GDB中使用了一个自定义的命令print_cpp_struct,它通过Python的GDB库打印了一个名为myPoint的C++结构体的值。

通过在GDB中使用Python的GDB库,开发者可以利用Python的强大功能扩展和增强调试的能力。它提供了丰富的API和灵活的脚本编写能力,使得调试过程更加高效和便捷。无论是自动化调试任务、数据分析和可视化,还是动态修改程序行为,Python的GDB库都为开发者提供了丰富的选择和灵活性。希望本文能够帮助您更好地理解和应用Python的GDB库,提升调试技能和开发效率。

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

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

相关文章

2024考研408-计算机组成原理第五章-中央处理器学习笔记

文章目录 前言一、CPU的功能与基本结构1.1、CPU的功能1.2、运算器与控制器需要实现功能1.3、运算器的基本结构1.3.1、基本结构构成(七个部分)1.3.2、各个部件详细介绍①算数逻辑运算单元②通用寄存器组(介绍数据通路的基本结构2个&#xff09…

C语言进阶---字符串+内存函数

本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项。 求字符串长度 strlen() 长度不受限制的的字符串函数 strcpy()strcat()strcmp() 长度受限制的的字符串函数 strncpy()strncat()strncmp() 字符串查找 strstr()strtok() 错误信息报告 strerror() 字符操作内存操作函…

《企业性能测试:体系构建、落地指导与案例解读》——小解送书第四期

目录 介绍 抽奖 介绍 软件系统性能的重要性无须多言,没有哪个用户可以忍受一个响应缓慢的网站或者反应迟钝的软件。软件性能是用户体验的核心。大部分用户可能对软件性能并不了解,但他们永远想使用响应更迅速的软件。所以,性能是评估一个软…

小程序data-*的误区

场景:点击按钮获取data-*的值跳转页面,跳转页获取传过来的参数 binnie: 华哥,为什么有的部分参数传不过去然后显示undefined? 华哥: binnie, 我看了一下你的代码,你错在属性名有大写字母了。我给你写了个…

postman自动生成接口文档

点击: 会自动生成一个文件夹 点击图表,修改名字 新建一个请求,到时候会自动保存到文件夹里面,但是保存前看清楚保存的名字 点击三个点-》点击export即可

Python提取斗鱼美女图片--selenium requests两种方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 使用selenium,requests提取斗鱼美女数据 数据来源 斗鱼美女链接 一、selenium是干嘛…

Leetcode-每日一题【206.反转链表】

题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5]输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3: 输…

ChatGPT助力校招----面试问题分享(七)

1 ChatGPT每日一题:SPI通信协议的四种工作模式 问题:SPI通信协议的四种工作模式 ChatGPT:SPI(Serial Peripheral Interface)总线是一种同步串行通信协议,它在多种数字系统中得到了广泛应用。SPI总线有四种…

nodejs全局模块安装与cnpm

一、通过nodejs官网安装 通过nodejs官网下载后安装 二、验证安装 1、在键盘按下【winR】键,输入cmd,然后回车,打开命令行界面 2、进入命令提示符窗口,分别输入以下命令,显示版本号,则安装成功&#xff0…

【AcWing算法基础课】第二章 数据结构(部分待更)

文章目录 前言课前温习一、单链表核心模板1.1题目描述1.2思路分析1.3代码实现 二、双链表核心模板2.1题目描述2.2思路分析2.3代码实现 三、栈核心模板3.1题目描述3.2思路分析3.3代码实现 四、队列核心模板4.1题目描述4.2思路分析4.3代码实现 五、单调栈核心模板5.1题目描述5.2思…

医疗科技革新:探索互联网医院线上就诊模式

随着互联网的迅猛发展,医疗行业也在逐渐融合科技创新,为患者提供更加便捷、高效的医疗服务。互联网医院作为一种新型医疗模式,通过在线平台实现医生与患者的远程沟通和线上诊疗,成为了医疗科技领域的热门话题。 在本文中&#x…

Django框架-6

向服务器传参 通过url - path传参 path(articles/<int:year>/<int:month>/<slug:slug>/, views.article_detail),查询字符串方式传参 http://localhost:8000?key1value1&key2value2 ;&#xff08;body&#xff09;请求体的方式传参&#xff0c;比如文…

Windos新机配置Java开发环境

一. 安装JDK8 解压&#xff0c;然后配置环境变量即可 配置JAVA_HOME path里添加&#xff1a; 二. MySql数据库安装与配置 参考&#xff1a; https://blog.csdn.net/annita2019/article/details/117467992 1.解压&#xff0c; Path中添加环境变量 D:\CodeSupport\Java_se…

华为OD机试真题 JavaScript 实现【求最大连续bit数】【牛客练习题】

一、题目描述 求一个int类型数字对应的二进制数字中1的最大连续数&#xff0c;例如3的二进制为00000011&#xff0c;最大连续2个1。 二、输入描述 输入一个int类型数字。 三、输出描述 输出转成二进制之后连续1的个数。 四、解题思路 使用位运算来实现。 具体思路如下&…

投票链接步骤公众号投票链接制作制作投票网页链接

大家在选择投票小程序之前&#xff0c;可以先梳理一下自己的投票评选活动是哪种类型&#xff0c;目前有匿名投票、图文投票、视频投票、赛事征集投票等。 我们现在要以“笛乐悠扬”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星”投票小程…

高手必备:JVM调优的常用命令和参数一网打尽!

大家好&#xff0c;我是小米&#xff01;在今天的技术分享中&#xff0c;我将和大家一起探讨JVM调优中的常用命令和参数。作为一名热爱技术的小伙伴&#xff0c;希望通过本篇文章的分享&#xff0c;能够帮助大家更好地理解和掌握JVM调优的方法和技巧。 JVM的结构 首先&#x…

C++ 预处理器

预处理器是一些指令&#xff0c;指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是以井号&#xff08;#&#xff09;开头&#xff0c;只有空格字符可以出现在预处理指令之前。预处理指令不是 C 语句&#xff0c;所以它们不会以分号&#xff08;;&#xff09…

操作系统5——输入输出系统

本系列博客重点在深圳大学操作系统课程的核心内容梳理&#xff0c;参考书目《计算机操作系统》&#xff08;有问题欢迎在评论区讨论指出&#xff0c;或直接私信联系我&#xff09;。 梗概 本篇博客主要介绍操作系统第六章输入输出系统的相关知识。 目录 一、I/O&#xff08;…

6-如何创建正态分布数组?【视频版】

目录 问题视频解答 问题 视频解答 点击观看&#xff1a; 6-如何创建正态分布数组&#xff1f;

buffer_head数据结构

内核版本&#xff1a;5.9.0 数据结构 /** Historically, a buffer_head was used to map a single block* within a page, and of course as the unit of I/O through the* filesystem and block layers. Nowadays the basic I/O unit* is the bio, and buffer_heads are us…