GDB in Action
GDB in Action
入门
编译
gcc -g -O0 -o word2vec.c word2vec
-g 选项:要求 gcc 编译器保留调试符号信息。
-O0 选项表示不优化,从 O1 ~ O4 优化级别越来越高,O4 最高。
strip 命令 = 不加 -g 选项。
启动
第一种
gdb word2vec
第二种
gdb attach (pid)
第三种
gdb word2vec core.21985
(gdb) 命令助记
run (r)
运行程序。也可以设置被调试程序的运行参数,如下例。
(gdb) run -train text8 -output vectors.bin -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 1 -iter 15
show args
Show argument list to give program being debugged when it is started.
Follow this command with any number of args, to be passed to the program.
continue (c)
当 GDB 触发断点或者使用 Ctrl + C 命令中断下来后,想让程序继续运行,只要输入 continue 命令即可。
break (b)
添加断点。
(gdb) break function_name # 在函数入口加断点
(gdb) break line_No # 在当前文件行号为 line_no 加断点
(gdb) break file_name:line_no # 在文件名为 file_name 文件,第 line_no 行加断点
backtrace (bt)
查看当前调用堆栈。
frame (f)
切换堆栈。
(gdb) f 2 #切换到编号为 2 的堆栈(第三层)
disble
Disable some breakpoints.
Arguments are breakpoint numbers with spaces in between.
To disable all breakpoints, give no argument.
A disabled breakpoint is not forgotten, but has no effect until re-enabled.
This command may be abbreviated "disable".
enable
Enable some breakpoints.
Give breakpoint numbers (separated by spaces) as arguments.
This is used to cancel the effect of the "disable" command.
May be abbreviated to simply "enable".
delete
Delete some breakpoints or auto-display expressions.
Arguments are breakpoint numbers with spaces in between.
To delete all breakpoints, give no argument.
This command may be abbreviated "delete".
list (l)
查看当前断点处的代码。往前和往后显示代码,命令分别是“list + (加号)”和“list - (减号)”。
where
打印当前程序运行位置和 frame。
print (p)
可以查看、计算和修改变量的值
(gdb) print a # 查看变量 a 的值
10
(gdb) print &a # 查看变量 a 的地址
(int *) 0x7ffffffde52c
(gdb) print a=12 # 打印并设置变量 a 的值为 12
12
(gdb) print a+a+a # 打印并计算 a+a+a 的值
36
(gdb) print a=a+a # 打印并设置变量 a 的值为 a+a
22
(gdb) print *p # 打印指针 p 指向对象的值
(gdb) print node->name # 打印结构体变量 node 的 name 字段的值
(gdb) p *a@4 # 打印数组 a 的前四个元素
ptype
打印变量的类型
info
info break (info b)
查看断点们的状态,可以显示断点被触发的次数。
info thread
Display currently known threads.
info threads [-gid] [ID]... # -gid: Show global thread IDs.
If ID is given, it is a space-separated list of IDs of threads to display.
Otherwise, all threads are displayed.
info args
查看当前函数被执行的,实参的值。
next
next over,运行下一行,遇到函数调用不进入。
step
step into,运行下一行,遇到函数调用时会进入。
finsh
结束当前函数,返回上层。
return
结束当前函数,返回上层。同时可以指定该函数的返回值。
(gdb) return 99 # 指定当前函数返回值 99
until (u)
指定程序运行到某一行停下来。
jump
让程序执行流跳转到指定位置执行。
可以执行一些我们想要执行的代码,而这些代码在正常的逻辑下可能并不会执行
disassemble
反汇编
tbreak
Set a temporary breakpoint.
Like "break" except the breakpoint is only temporary, so it will be deleted when hit. Equivalent to "break" followed by using "enable delete" on the breakpoint number.
watch
监视一个变量或者一段内存,当这个变量或者该内存处的值发生变化时,GDB 就会中断下来。被监视的某个变量或者某个内存地址会产生一个 watch point(观察点)。
当设置的观察点是一个局部变量时,局部变量无效后,观察点也会失效。
display
监视变量或者内存地址,每次程序中断下来都会自动输出这些变量或内存的值。
signal
Continue program with the specified signal.
signal [SIGNAL]
The SIGNAL argument is processed the same as the handle command.
SIGNAL: SIGCHLD, SIGPIPE, SIGINT, SIGTERM......
handle
Specify how to handle signals.
handle [SIGNAL]
for example
handle SIGINT nostop print
告诉 GDB 在接收到 SIGINT 时不要停止,并把该信号传递给调试目标程序 。
break [lineNo] if [condition]
条件断点。
break 11 if i==5000 # 意为当 i = 5000 时,程序中断在第 11 行
添加条件断点还有一个方法就是先添加一个普通断点,然后使用“condition 断点编号断点触发条件”这样的方式来添加。
condition
Specify breakpoint number N to break only if COND is true.
condition N COND
where N is an integer and COND is an expression to be evaluated whenever breakpoint N is reached.
set
scheduler-locking
Set mode for locking scheduler during execution.
- off - no locking (threads may preempt at any time)
- on - full locking (no thread except the current thread may run). This applies to both normal execution and replay mode.
- step - scheduler locked during stepping commands (step, next, stepi, nexti). In this mode, other threads may run during other commands. This applies to both normal execution and replay mode.
- replay - scheduler locked in replay mode and unlocked during normal execution.
follow-fork-mode
Set debugger response to a program call of fork or vfork.
A fork or vfork creates a new process. follow-fork-mode can be:
- parent - the original process is debugged after a fork
- child - the new process is debugged after a fork
The unfollowed process will continue to run.
By default, the debugger will follow the parent process.
print element
Set limit on string chars or array elements to print.
"set print elements unlimited" causes there to be no limit.
"set print element 0" 完整地显示变量的整个字符串。
args
Set argument list to give program being debugged when it is started.
Follow this command with any number of args, to be passed to the program.
(gdb) set args -train text8 -output vectors.bin -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 1 -iter 15
Reference
[1] 《Linux GDB 调试指南》. 范蠡. https://gitbook.cn/gitchat/column/5c0e149eedba1b683458fd5f
GDB in Action的更多相关文章
- Oracle Solaris 11.4安装桌面/gdb
文章目录 1. 说明 2. 挂载镜像 3. 安装桌面 4. 安装gdb 5. 重启OS 1. 说明 该文承接上文Solaris 11.4安装,映像包管理系统(IPS)搭建. Solaris 11.4的 ...
- GDB 调试 一些命令
1. gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式 x/ (n,f,u为可选参数)n: 需要显示的内存单元个数,也就是从 ...
- Android隐式启动匹配:action,category,data
简介 Android开发中,Activity,Service 和 BroadcastReceiver 启动有两种方式,显示启动和隐式启动. 为方便下面描述,我以Activity启动为例. 显示启动便是 ...
- 用gdb调试python多线程代码-记一次死锁的发现
| 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 前言 相信很多人都有 ...
- gdb 调试入门,大牛写的高质量指南
引用自:http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU 调 ...
- gdb 调试 ncurses 全过程:
转载地址: http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU ...
- GDB调试,转载一位大牛的东西
http://www.wuzesheng.com/?p=1327 手把手教你玩转GDB(一)——牛刀小试:启动GDB开始调试 写在最前面:GDB是unix相关操作系统中C/C++程序开发必不可少的工具 ...
- gdb调试汇总
1. 启动GDB开始调试: (1)gdb program ///最常用的用gdb启动程序,开始调试的方式(2)gdb program core ///用gdb查看core dump文件,跟踪程序cor ...
- gdb core调试
原文链接 http://blog.163.com/lanka83/blog/static/32637615200801793020182/http://blog.csdn.net/taina2008/ ...
随机推荐
- springBoot整合ftp上传图片功能
知识点: springBoot后端项目,接收前端框架传到的图片,把图片上传到ftp图片服务器上 注意:在上传的过程中可能回出现,可以创建文件夹,但是图片上传不了的问题: 尝试了网上的很多方法,最后将f ...
- [原]Jenkins(二十一) jenkins再出发Build periodically和Poll SCM
缘由: 使用jenkins的目的需要固定时间构建和间隔固定时间构建,所以才会用到这两个功能. 位置:这两个功能的位置位于每个job的config项中,如下图: [重要的注意点:] ...
- 关于4A网络安全管控平台控件加载失败的解决方法
最近电脑重装系统后,到公司登录4A管控平台提示"控件加载失败","无效的参数为:Null","点击资源无任何反映"等等问题 别人的电脑用的好 ...
- ToolBar样式颜色,图标设置
extends:http://blog.csdn.net/w1054993544/article/details/48339565 <resources> <style name=& ...
- 六种常见排序算法的java实现
package edu.cn.ysw; //八种排序算法的实现与效率分析 /* * 内排序的种类: * 1.插入排序:直接插入排序.希尔排序. * 2.选择排序:简单选择排序.堆排序. 3.交换排序: ...
- Sublime Text3 3143 注册码,亲测可用!
希望大家支持正版!!! 注册码: —– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA ...
- TensorRT层和每个层支持的精度模式
下表列出了TensorRT层和每个层支持的精确模式.它还列出了该层在深度学习加速器(DLA)上运行的能力.有关附加约束的更多信息,请参见 DLA Supported Layershttps://doc ...
- Python爬虫实例(四)网站模拟登陆
一.获取一个有登录信息的Cookie模拟登陆 下面以人人网为例,首先使用自己的账号和密码在浏览器登录,然后通过抓包拿到cookie,再将cookie放到请求之中发送请求即可,具体代码如下: # -*- ...
- Java如何获取图片验证码保存
举例网站:https://my.1hai.cn/Login/?url=http://www.1hai.cn/ 一.场景:出于安全性考虑,越来越多的Web平台登录都会增加图形验证码(图片),或者短信验证 ...
- ES6 迭代器
Iterator Iterator 是 ES6 引入的一种新的遍历机制,迭代器有两个核心概念: 迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.itera ...