GDB调试技巧
1. 查看内存分布 (gdb) info proc mappings
2. 对于类的调试,先通过行号来设断点, 比如:(gdb) b TcpConnection.cc:63
3. 打印数组的内容 (gdb) p *array@len
4. 查看全局变量的地址,比如info line <variable>
5. 使用十六进制逐个打印内存 x/10xb <address>,其中第二个x是16进制,b是字节
6. 通过指针打印对象 p *(<class> *)<address>
7. 使用up和down切换堆栈,查看堆栈内的locals,如p <variable>
7. 举例如何看汇编和寄存器,下面r开头的寄存器表示64位寄存器
这是一个string的compare函数
(gdb) disassemble 0x00007fb12eeff2ac <- 根据指令地址获得汇编代码
0x00007fb12eeff2a0 <+0>: push %rbp
0x00007fb12eeff2a1 <+1>: push %rbx
0x00007fb12eeff2a2 <+2>: sub $0x8,%rsp
0x00007fb12eeff2a6 <+6>: mov (%rdi),%rdi <- 第一个参数是this指针,取得的是string的M_data
0x00007fb12eeff2a9 <+9>: mov (%rsi),%rsi <- 第二个参数是对比的字符串,取得的是string的M_data
=> 0x00007fb12eeff2ac <+12>: mov -0x18(%rdi),%rbp <- 取第一个字符串的size, 地址是偏移24Bytes,第三个整型
0x00007fb12eeff2b0 <+16>: mov -0x18(%rsi),%rbx
0x00007fb12eeff2b4 <+20>: mov %rbp,%rdx <- 以下三句是取%rbp 和 %rbx的min值,最终min的结果存在%rdx
0x00007fb12eeff2b7 <+23>: cmp %rbp,%rbx
0x00007fb12eeff2ba <+26>: cmovbe %rbx,%rdx
0x00007fb12eeff2be <+30>: callq 0x7fb12ee9ec70 <memcmp@plt> <- %rdi, %rsi, %rdx 构成了memcmp的三个参数
0x00007fb12eeff2c3 <+35>: test %eax,%eax
std::string::compare代码如下
int
compare(const basic_string& __str) const
{
const size_type __size = this->size();
const size_type __osize = __str.size();
const size_type __len = std::min(__size, __osize);
int __r = traits_type::compare(_M_data(), __str.data(), __len);
if (!__r)
__r = _S_compare(__size, __osize);
return __r;
}
通过info registers可以获得上述的%rdi, %rsi, %rdx寄存器的值
通过x/147cb打印147Byte的字符串
通过x/1xg打印一个64位的整型
GDB调试技巧的更多相关文章
- GDB调试技巧:总结篇
目录 一 写在开头 1.1 本文内容 二 学习资料 三 常用命令 四 调试技巧 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 总结GDB调试的一些常用命令和调试 ...
- pwn 题GDB调试技巧和exp模板
GDB分析ELF文件常用的调试技巧 gdb常用命令 首先是gbd+文件名 静态调试 ,gdb attach +文件名 动态调试 为了方便查看堆栈和寄存器 最好是安装peda插件 安装 可以通过pip直 ...
- gdb调试技巧 找到php执行进程当前执行的代码
假设线上有一段php脚本,突然在某天出问题了,不处理但是进程没有退出.这种情况可能是异常休眠或者是有段死循环代码,但是我们怎么定位呢,我们这个时候最想知道的应该是这个脚本在此刻在做什么吧.这个是gdb ...
- 100个gdb调试技巧
找到的一个有参考价值的关于GDB调试的站点:https://gitlore.com/subject/15
- GDB 调试技巧(不断更新中......)
一.break到不同类的同名函数 方法: 在函数前面加类名以及作用域运算符 eg : break A::func //break 到类A的func函数 程序如下: //gdb_test.cpp #in ...
- Linux基础 30分钟GDB调试快速突破
引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...
- GDB调试基础
GDB调试基础 https://lesca.me/archives/gdb-basic-knowledge.html GDB笔记(二):条件断点.命令列表.监视点 https://lesca.me/a ...
- GDB调试命令手册
使用GDB 启动 $ gdb program # program是你的可执行文件,一般在当前目录 $ gdb program core # gdb同时调试运行程序和cor ...
- 【转贴】gdb中的信号(signal)相关调试技巧
一篇不错的帖子,讲的是gdb中的信号(signal)相关调试技巧 转自Magic C++论坛 http://www.magicunix.com/index_ch.html http://www.m ...
随机推荐
- VIM快捷键(转)
VIM快捷键:光标移动:四个方向 kh 0 l j ctrl+f, ctrl+b 向下翻页,向上翻页 ctrl+d, ctrl+u ...
- HTML DOM(一):认识DOM
分类: HTML/JavaScript/CSS(10) 版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/ghsau. 什么是DOM? 通过 Jav ...
- iOS触摸事件处理
iOS触摸事件处理 主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块, (1)首先在视图的层次结构里找到能响应消息的那个视图. (2 ...
- iOS播放短的音效
在IOS中,有的时候需要播放很简短的声音文件,比如系统声音等,我们需要使用到下面的方式来播放声音: // 一.引入头文件 #import <AudioToolbox/AudioToolbox.h ...
- nodejs template
Server-side http://cnodejs.org/topic/514ba98af848e01f6b2956bf http://jade-lang.com/ http://cnodejs.o ...
- iOS之H5和Native混合开发
今天需要用到一个H5和Native 混合开发的项目,简单的写一点入门的东西,很简答: 先介绍一下简单的配置步骤: 1.新建项目:SB拖一个UIWebView 按住Ctrl 拖线delegate 设置为 ...
- XSHELL和XFTP,亲兄弟啊。
XSHELL在LINUX和WINDOWS之间传输文件时不力啊.又对FTP不灵活的时候,XFTP就可以出场了. 只要登陆进XSHELL就可以操作了.并且XFTP客户端和命令行可以灵活配置选择. 然后,玩 ...
- 【HDOJ】2363 Cycling
二分+Dijkstra. #include <iostream> #include <cstdio> #include <cstring> #include < ...
- XFS:大数据环境下Linux文件系统的未来?
XFS:大数据环境下Linux文件系统的未来? XFS开发者Dave Chinner近日声称,他认为更多的用户应当考虑XFS.XFS经常被认为是适合拥有海量数据的用户的文件系统,在空间分配方面的可 ...
- 有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a
题目:有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a,具体实现如下: #include<stdlib.h> #include ...