GDB常用命令

GDB常用命令,第1张

1、file

载入调试程序,同时加载符号表

2、core-file

载入core dump程序映像,

gdb命令行参数形式: (-c | -core) core-file

3、symbol-file

从指定文件载入符号表

gdb命令行参数形式: (-s | -se | -symbols) symbol-file

4、directory

添加源文件搜索路径

gdb命令行参数形式: (-d | -directory) source-directory

5、r — run

启动调试程序,可传入参数

6、c — continue

跳过断点继续执行

7、s — step

单步执行,进入子程序内部

8、n — next

单步执行,越过子程序执行

9、b — break

设置断点,使用行号或函数名

10、i — info

显示断点info breakpoints

11、d — delete

删除断点delete breakpoints

12、bt — backtrace

打印栈帧

13、p — print

打印变量

/x 按十六进制格式显示变量

/d 按十进制格式显示变量

/u 按十六进制格式显示无符号整型

/o 按八进制格式显示变量

/t 按二进制格式显示变量

/a 按十六进制格式显示变量

/c 按字符格式显示变量

/f 按浮点数格式显示变量

14、l — list

显示程序源码

15、jump

跳转到第n行处开始调试

16、call

调用函数

17、finish

退出当前函数返回到它的调用函数

18、watch

设置观察点,当表达式的值改变时停止运行

19、awatch

设置观察点,当表达式的值被读取或发生改变时停止运行

20、commands

设置当遇到断点n时执行的特定动作命令

1、对于在应用程序中加入参数进行调试的方法:

直接用 gdb app -p1 -p2 这样进行调试是不行的。

需要像以下这样使用:

#gdb app

(gdb) r -p1 -p2

或者在运行run命令前使用set args命令:

(gdb) set args p1 p2

可以用show args 命令来查看

2、加入断点:

break <linenumber>

break <funcName>

break +offset

break -offset

(在当前行号的前面或后面的offset行停住。)

break filename:linenum

在源文件filename的linenum行处停住。

break filename:function

在源文件filename的function函数的入口处停住。

扩展资料:

一般来说,GDB主要帮助完成下面四个方面的功能:

1、启动程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)

3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

参考资料来源:百度百科-gdb

前几天一个小伙伴发邮件问我,他在docker内部使用gdb调试时刻遇到了gdb如下报错信息

ptrace:Operation not permitted

当时我的答复是在docker create或者docker run时刻开启 万精油--privileged参数 。小伙伴的问题就此解决了。

但是事实并非如此简单

Docker借用了linux对进程设置capabilities,而其子进程继承父进程capabilites特性来完成对容器capacities的控制。Docker create和docker run参数中有下面两个参数可以对容器默认的capabilites进行修改:

--cap-add //添加某个capabilites属性 --cap-del //剔除某个默认的capabilites属性

cap-add和cap-del可以设置的参数可以通过下面链接查询到:

https://docs.docker.com/engine/reference/commandline/run/

但是这并不是问题的全部,对于上述测试程序,如果执行下面命令gdb又有告警出来

虽然依然可以调试,但是我们还是需要搞清楚上述告警的意思。地址随机化是linux一项安全特性,它允许内核进程启动每次加载库的时候都在随机化的分布在进程虚拟内存地址空间上(早期固定的库要加载到固定地方,如果固定地方被占用才加载到别地方。会造成多次加载程序,其库地址都不变。如此有安全隐患)。在gdb调试中gdb默认需要关闭linux的地址随机化功能,可以通过gdb 命令set disable-randomization off关闭。 如果在地址随机化下调试同一段程序,多次run时候可以看到它的运行地址和函数地址不一致,这没有什么太大的问题。问题可以结束一半了

关于gdb 设置地址随机化开关详情见下面链接:

http://visualgdb.com/gdbreference/commands/set_disable-randomization

当然上述告警其实也可以不通过gdb设置来完成,可以通过下面介绍的Docker参数可以达成。

Docker默认情况下为每个容器都设置了一个默认的seccom profile。一般情况下无需修改。但是docker依然支持

docker create或者docker run时候通过--security-opt seccomp=xxx参数来设置docker容器的seccomp策略。

xxx可以是一个json格式文件,里面定义了docker容器每个具体的seccomp规则。也可以是字符unconfined表示关闭默认的docker seccomp 规则。

可以通过下面命令彻底关闭docker默认seccomp引入的任何限制

docker run -it --security-opt seccomp=unconfined centos:lastes

在运行上述gdb 调试命令run一个进程,告警信息终于彻底消失了。

Docker设置的seccomp 默认profile规则可以通过如下链接查询到:

https://docs.docker.com/engine/security/seccomp/

本文就不再做详细展开了。

从Linux 2.6.23开始支持这种特性对进程能够使用的系统调用进行控制,如此可以进行一些安全性策略。sandbox就是依赖于此技术。docker梳理了Linux的系统调用,从300+个系统调用中屏蔽掉了44个系统调用,但是又最大程度的不影响正常的应用使用系统。

从Linux 2.1开始支持的特性,将超级用户的权限划分为多个组,每个进程都有一个capabilities属性,子进程从自己的父进程中基础capacities。这个特性和sudo不一样,因为sudo控制粒度太粗;而capabilities控制粒度很精细。linux有一系列的调用可以设置、查看,清除和比较进程的capabilities。可以通过:

man cap_set_flag

来查看这一系列的系统调用。而具体进程的capacities可以通过/proc/$pid/status中:

Capxxx字段看到,本文就不再展开。感兴趣的朋友可以参考

https://www.cnblogs.com/iamfy/archive/2012/09/20/2694977.html


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/6049466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-13
下一篇 2023-03-13

发表评论

登录后才能评论

评论列表(0条)

保存