热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GDB使用心得与技巧总结

在使用GDB进行调试时,可以采用以下技巧提升效率:1.通过设置`setprintprettyon`来美化打印输出,使数据结构更加易读;2.掌握常见数据结构的打印方法,如链表、树等;3.利用`infolocals`命令查看当前作用域内的所有局部变量;4.在需要进行类型强制转换时,正确使用语法,例如`p(Test::A*)pObj`。这些技巧能够显著提高调试的便捷性和准确性。

1.打印好看 set print pretty on

2.常用数据结构打印

3. info locals

4.如何强制转换类型,得加''

错:p *(Test::A*)pObj2 

对:p *('Test::A'*)pObj2

5.打印所有堆栈  thread apply all bt

打印堆栈到文件

set logging file /tmp/test.txt

set logging on

thread apply all bt

6.指针强转

 p ((std::_Vector_base, std::allocator > const*, std::allocator, std::allocator > const*> >*)0x7ffe310cc1a8)[0]._M_impl._M_start[0]

p value_ptr→_meta_vec._M_impl._M_start[7].proto

 p _protos._M_impl._M_start[7]

7.string条件断点

 b object_pool.h:72 if _limit_name.compare("pre_list") == 0

会报错 Unable to restore previously selected frame:

Selected thread is running.

terminate called after throwing an instance of 'gdb_exception_RETURN_MASK_ERROR'

8.predictor_serve" received signal SIGPIPE, Broken pipe.

When debugging with 'gdb', it is possible to manually disable SIGPIPE as follows:

(gdb) handle SIGPIPE nostop

7.程序卡住了

gdb attach ,其中为您的进程id。进入gdb后输入命令thread apply all bt查看进程中所有线程的状态,查看进程hang在哪了。

8.

set solib-search-path /opt/compiler/gcc-4.8.2/lib

9.当程序优化了部分变量,可以layout asm 看当前寄存器值。

10.


2. 汇编 + addr2line

对于线上core问题,一般没法再对程序进行去编译优化操作,只能在现有的core文件基础上进行代码定位,这一节我们采用一个例子来介绍如何使用汇编 + addr2line来定位代码行。

从截图可以发现frame 20指示的代码行与实际的代码行是不匹配的,这里我们采用汇编 + addr2line进行修复。


frame 20

layout asm

shell /opt/compiler/gcc-8.2/bin/addr2line -e bin address

这里直接使用了layout asm命令显示了汇编代码,命令使用传送门。最后通过addr2line命令把汇编地址转化成实际代码行。但如果想看汇编代码disassemble func_name

10. 无规律core栈

无规律core栈问题一般发生于堆内存写坏。函数调用是一个非常精密的过程,任何一个位置发生非预期的读写都会导致程序崩溃。这里可以举个小例子来说明:


1

2

3

4

5

6

int main(int argc, char* argv[]) {

    std::string s("abcd");

    *reinterpret_cast(&s) = 0x11;

     

    return 0;

}

上面的例子core在string析构上,原因是因为string的_M_ptr被改写成了0x11,析构流程变成了非法内存操作。

同理,由于进程堆空间是共享的,一个线程对堆的非法操作就可能会影响另一个线程的正常操作,由于堆分配的随机性,表现出来的现象就是无规律core栈。

针对无规律core栈最好的方式还是借助AddressSanitizer。


#设置编译参数CXXFLAGS

CXXFLAGS="-fPIC -fsanitize=address  -fno-omit-frame-pointer"

#设置链接参数

LDFLAGS="-lasan"

# 设置启动环境变量

export ASAN_OPTIONS=halt_on_error=0:abort_on_error=1:disable_coredump=0

# 启动

LD_PRELOAD=/opt/compiler/gcc-8.2/lib/libasan.so ./bin/xxx

10.函数栈修复

有时候我们会发现函数调用栈里面会出现很多??的情况,这常发生于栈被写花,某些情况下手动进行修复。函数栈的修复利用的函数栈内存分布知识,见第一节。

-----------------------------------
Low addresses
-----------------------------------
0(%rsp) | top of the stack frame | (this is the same as -n(%rbp))
---------|-------------------------
-n(%rbp) | variable sized stack frame
-8(%rbp) | varied
0(%rbp) | previous stack frame address
8(%rbp) | return address
-----------------------------------
High addresses

从上面的栈示意图可以发现,利用%rbp寄存器即可找到上一个函数的返回地址栈底指针,再利用addr2line命令找到对应的代码行。这里举一个例子:


1

2

3

4

5

6

#首先找到当前被调用栈上一个栈的栈底指针值和返回地址

/2ag $rbp # 2个单位,a=十六进制,g=8字节单元

#使用上一条命令得到的栈底指针值依次递归

/2ag address


推荐阅读
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
  • 文件描述符、文件句柄与打开文件之间的关联解析
    本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ... [详细]
author-avatar
手机用户2502910101
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有