【GDB】用 python 扩展 gdb

用 python 扩展 GDB

.gdbinit 文件中实现自定义命令 mv 代码如下

define mvif $argc == 2delete $arg0# 注意新创建的断点编号和被删除断点的编号不同break $arg1elseprint "输入参数数目不对,help mv 以获得用法"end
end# (gdb) help mv 会输出以下帮助文档
document mv
Move breakpoint.
Usage: mv old_breakpoint_num new_breakpoint
Example:(gdb) mv 1 binary_search -- move breakpoint 1 to `b binary_search`end

python 实现代码如下

# move.py
# 1. 导入 gdb 模块来访问 gdb 提供的 python 接口
import gdb# 2. 用户自定义命令需要继承自 gdb.Command 类
class Move(gdb.Command):# 3. docstring 里面的文本是不是很眼熟?gdb 会提取该类的__doc__属性作为对应命令的文档"""Move breakpointUsage: mv old_breakpoint_num new_breakpointExample:(gdb) mv 1 binary_search -- move breakpoint 1 to `b binary_search`"""def __init__(self):# 4. 在构造函数中注册该命令的名字super(self.__class__, self).__init__("mv", gdb.COMMAND_USER)# 5. 在 invoke 方法中实现该自定义命令具体的功能# args 表示该命令后面所衔接的参数,这里通过 string_to_argv 转换成数组def invoke(self, args, from_tty):argv = gdb.string_to_argv(args)if len(argv) != 2:raise gdb.GdbError('输入参数数目不对,help mv 以获得用法')# 6. 使用 gdb.execute 来执行具体的命令gdb.execute('delete' + argv[0])gdb.execute('break' + argv[1])# 7. 向 gdb 会话注册该自定义命令
Move()

.gdbinit 文件中导入 python 文件

layout src
# 导入 python 文件
source test.py
...
...

这样 gdb 每次启动时都会替我们 source 一下

gdb 的 python 接口

gdb 通过 gdb 模块提供了不少 python 接口。其中最为常用的是 gdb.executegdb.parse_and_eval

  • gdb.execute 可用于执行一个 gdb 命令。默认情况下,结果会输出到 gdb 界面上。如果想把输出结果转存到字符串中,设置 to_string 为 True:gdb.execute(cmd, to_string=True)。

  • gdb.parse_and_eval 接受一个字符串作为表达式,并以 gdb.Value 的形式返回表达式求值的结果。举例说,gdb 当前上下文中有一个变量 i,i 等于 3。那么 gdb.parse_and_eval(‘i + 1’) 的结果是一个 gdb.Value 的实例,其 value 属性的值为 4。这跟 (gdb) i + 1 是等价的。

何为 gdb.Value?在 gdb 会话里,我们可以访问 C/C++ 类型的值。当我们通过 python 接口跟这些值打交道时,gdb 会把它们包装成一个 gdb.Value 对象。

举个例子,struct Point 有 x 跟 y 两个成员。现在假设当前上下文中有一个 Point 类型的变量 point 和指向该变量的 Point 指针 p,就意味着:

point = gdb.parse_and_eval('point')
point['x'] # 等价于point.x
point['y'] # 等价于point.y
point.referenced_value() # 等价于&pointp = gdb.parse_and_eval('p')
point2 = p.dereference() # 等价于*p
point2['x'] # 等价于(*p).x,也即p->x

示例

C 代码

#include <stdio.h>typedef struct
{int x;int y;
} point_t;int binary_search(int *ary, unsigned int ceiling, int target)
{unsigned int floor = 0;while (ceiling > floor){unsigned int pivot = (ceiling + floor) / 2;if (ary[pivot] < target)floor = pivot + 1;else if (ary[pivot] > target)ceiling = pivot;elsereturn pivot;}return -1;
}void set_point_data(point_t *point_in, point_t *p_point_in, int x, int y)
{point_in->x = x;point_in->y = y;return;
}int main(int argc, char *argv)
{int a[] = {1, 2, 4, 5, 6};point_t point1;point_t *p_point;printf("%d\r\n", binary_search(a, 5, 7)); /* -1 */printf("%d\r\n", binary_search(a, 5, 6)); /* 4 */printf("%d\r\n", binary_search(a, 5, 5)); /* 3 */p_point = &point1;point1.x = 78;point1.y = 78;set_point_data(&point1, p_point, 1, 2);printf("%d %d\r\n", point1.x, point1.y);printf("%d %d\r\n", p_point->x, p_point->y);return 0;
}

.gdbinit 代码

layout src
# 导入 python 文件
source test.pyb main
b binary_search if target == 5b set_point_data
# set_point_data 触发的命令
comm
# 向命令 print_point 传递的参数是 *point_in 和 p_point_in
print_point *point_in p_point_in
end# 断点 1 触发执行的命令
command 1
i locals
i args
end# 断点 2 触发执行的命令
comm 2
i locals
i args
end

python 代码

# 1. 导入gdb模块来访问gdb提供的python接口
import gdb# 2. 用户自定义命令需要继承自gdb.Command类
class Move(gdb.Command):# 3. docstring里面的文本是不是很眼熟?gdb会提取该类的__doc__属性作为对应命令的文档"""Move breakpointUsage: mv old_breakpoint_num new_breapkpointExample:(gdb) mv 1 binary_search -- move breakpoint 1 to `b binary_search`"""def __init__(self):# 4. 在构造函数中注册该命令的名字super(self.__class__, self).__init__("mv", gdb.COMMAND_USER)# 5. 在invoke方法中实现该自定义命令具体的功能# args表示该命令后面所衔接的参数,这里通过string_to_argv转换成数组def invoke(self, args, from_tty):argv = gdb.string_to_argv(args)if len(argv) != 2:raise gdb.GdbError('输入参数数目不对,help mv以获得用法')# 6. 使用gdb.execute来执行具体的命令gdb.execute('delete ' + argv[0])gdb.execute('break ' + argv[1])# 7. 向gdb会话注册该自定义命令
Move()class print_point(gdb.Command):def __init__(self):super(self.__class__, self).__init__("print_point", gdb.COMMAND_USER)def invoke(self, args, from_tty):point = gdb.parse_and_eval('point_in')print(point['x']) # 等价于 point.xprint(point['y']) # 等价于 point.ypoint.referenced_value() # 等价于 &pointp = gdb.parse_and_eval('p_point_in')point2 = p.dereference() # 等价于 *pprint(point2['x']) # 等价于 (*p).x,也即 p->xprint(point2['y']) # 等价于 (*p).y,也即 p->y
print_point()

效果

在这里插入图片描述

参考

https://github.com/kfggww/algorithms-in-c/tree/main
https://segmentfault.com/a/1190000005718889

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

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

相关文章

centos 6使用yum安装软件

1. 执行以下命令&#xff0c;查看当前操作系统 CentOS 版本。 cat /etc/centos-release返回结果如下图所示&#xff0c;则说明当前操作系统版本为 CentOS 6.9。 2. 执行以下命令&#xff0c;编辑 CentOS-Base.repo 和CentOS-Epel.repo文件。 vim /etc/yum.repos.d/CentOS-Bas…

Scrapy-应对反爬虫机制

参考自https://blog.csdn.net/y472360651/article/details/130002898 记得把BanSpider改成自己的项目名&#xff0c;还有一个细节要改一下&#xff0c;把代码user换成user_agent 禁止Cookie 在Scrapy项目中的settings文件&#xff0c;可以发现文件中有以下代码: COOKIES_ENA…

【软件评测】Apowersoft 傲软抠图AI智能换背景工具软件

现如今的数字图像处理已经成为人们生活中不可或缺的一部分&#xff0c;而图像抠图作为其中的重要环节&#xff0c;更是被广泛应用于设计、摄影、广告等领域。为了满足用户的需求&#xff0c;Apowersoft推出了一款傲软抠图AI智能换背景工具&#xff0c;宣称能够自动抠图并智能替…

如何使用ArcGIS Pro制作标准地图样式国界

相信大家都浏览过标准地图服务提供的标准地图&#xff0c;不知道你有没有想过尝试制作里面的国界&#xff0c;这里为大家介绍一下制作方法&#xff0c;希望能对你有所帮助。 制作已定国界 在地图数据内&#xff0c;国界分为已定国界、未定国界和海岸线&#xff0c;我们先对已定…

k8s--storageClass自动创建PV

文章目录 一、storageClass自动创建PV1.1 安装NFS1.2 创建nfs storageClass1.3 测试自动创建pv 一、storageClass自动创建PV 这里使用NFS实现 1.1 安装NFS 安装nfs-server&#xff1a; sh nfs_install.sh /mnt/data03 10.60.41.0/24nfs_install.sh #!/bin/bash### How to i…

overleaf杂谈-Springer文献格式问题

目录 overleaf写作问题记录1.Latex中的%问题&#xff08;文本变成灰色&#xff09;2.Springer文献格式问题2.1 新建reference.bib2.2 谷歌学术搜索文章并引用2.3 复制BibTex2.4 复制进reference.bib2.5 在sn-article.tex的\end{document}前添加语句2.6 引用文献2.7 Springer模板…

docker 安装本地starrocks测试环境

安装文档 Quick start: Deploy StarRocks with Docker deploy_in_docker StarRocks Docs Quick start: Deploy StarRocks with Docker deploy_in_docker StarRocks Docs 镜像版本 https://hub.docker.com/r/starrocks/allin1-ubuntu/tags?page1 docker安装starrocks

最新AI智能写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt+MJ以图生图+思维导图生成

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

Python Cartopy地图投影【3】

上两期文章见&#xff1a; Python Cartopy地图投影【1】 第一期文章内容纲要&#xff1a; step1: 开始地图投影 step2: GeoAxes 的常用方法 2.1 add_feature&#xff1a;添加海岸线、河流、湖泊等地理特征 2.2 gridlines&#xff1a;添加网格线以及相应标签等 Python Cartopy地…

怎么修改jupyter lab 的工作路径而不是直接再桌面路径打开

要修改Jupyter Lab的工作路径&#xff0c;你可以按照以下步骤操作&#xff1a; 打开终端或命令提示符窗口。 输入 jupyter lab --generate-config 命令来生成Jupyter Lab的配置文件。 找到生成的配置文件&#xff0c;通常会位于 ~/.jupyter/jupyter_notebook_config.py。 使…

常用数学分布

正态分布&#xff08;高斯分布&#xff09; 若随机变数 X X X 服从一个期望 μ \mu μ&#xff0c;标准差 的正态分布 σ \sigma σ&#xff0c;则记为 X ≈ N ( μ , σ 2 ) X \approx N(\mu,\sigma^2) X≈N(μ,σ2)&#xff0c;其密度函数为&#xff1a; f ( x ) 1 σ …

唤醒手腕 Matlab 游戏编程常用技术知识点详细教程(更新中)

Figure 窗口初始化 figure 使用默认属性值创建一个新的图窗窗口。生成的图窗为当前图窗。f figure(___) 返回 Figure 对象。可使用 f 在创建图窗后查询或修改其属性。figure(f) 将 f 指定的图窗作为当前图窗&#xff0c;并将其显示在其他所有图窗的上面。 figure(n) 查找 Nu…

raw智能照片处理工具DxO PureRAW mac介绍

DxO PureRAW Mac版是一款raw智能照片处理工具&#xff0c;该软件采用了智能技术&#xff0c;以解决影响所有RAW文件的七个问题&#xff1a;去马赛克&#xff0c;降噪&#xff0c;波纹&#xff0c;变形&#xff0c;色差&#xff0c;不想要的渐晕&#xff0c;以及缺乏清晰度。 Dx…

机器学习之广义增量规则(Generalized Delta Rule)

文章目录 广义增量规则的公式s型函数的增量规则 广义增量规则的公式 对于单层神经网络的增量规则&#xff0c;已经过时啦&#xff0c;现在存在一种更广义的增量规则形式。对于任意激活函数&#xff0c;增量规则表示如下式它与前一节的delta规则相同&#xff0c;只是ei被替换为…

【Office】超简单,Excel快速完成不规则合并单元格排序

演示效果&#xff1a;将下图已经合并了的单元格按照单位名称排序并将同一个单位的数据合并在了一起。 Step 1&#xff1a;取消合并 选中所有的数据后&#xff0c;点击 “开始”-“合并单元格” &#xff0c;并且取消数据源的合并。 Step 2&#xff1a;填充数据 选中需要填…

C/C++字符函数和字符串函数详解————长度受限制的字符串函数

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.长度受限制的字符…

1.5.C++项目:仿mudou库实现并发服务器之socket模块的设计

项目完整版在&#xff1a; 一、socket模块&#xff1a;套接字模块 二、提供的功能 Socket模块是对套接字操作封装的一个模块&#xff0c;主要实现的socket的各项操作。 socket 模块&#xff1a;套接字的功能 创建套接字 绑定地址信息 开始监听 向服务器发起连接 获取新连接 …

应用架构的演进:亚马逊的微服务实践

当你在亚马逊上购物时,或许不会想到,你看到的这个购物网站,其背后技术架构经历了什么样的变迁与升级。 还记得上世纪 90 年代,那个只卖书的网上书店吗?那时的亚马逊,不过是一个架构简单的网站,所有的功能都堆积在一个庞大的软件堡垒里。随着更多业务的增加、更新和迭代,这个软…

二、BurpSuite Scan扫描

1.Scan details 解释&#xff1a;选择只是爬行还是爬行加代码审计 Scan Type&#xff1a;选择爬行或者代码审计URLs to scan&#xff1a;定义要扫描的网址。Burp将从这些网址开始进行爬行&#xff0c;并默认将包括指定网址文件夹下的所有内容。Protocol settings&#xff1a;使…

Unity2023打包首包从78Mb到3.0Mb-震惊-我做对了什么

&#xff08;全程并没有使用AssetBundle , 历史原因&#xff0c;Resources目录还有不少资源残留&#xff09; 曾经的我在2019打包过最小包10m左右&#xff0c;后来发现到了Unity2020之后暴增到40m&#xff0c;又加上2023版本URP&#xff0c;1个Unity输出包可能至少55M 如下图…