工具知识 | gdb使用相关知识

gdb使用相关知识

  1. 什么是gdb

    参考答案

    gdb全称为GNU Debugger,是可以运行于多种类Unix平台的程序调试软件。类似的软件还有lldblldb常用于macos

    参考资料:

  2. gdb常见命令有哪些?

    参考答案

    gdb的常见命令有:

    1. help: 获取gdb命令帮助
    2. help <command>: 获取特定gdb命令的帮助
    3. run: 运行到下个断点或程序结束
    4. step: 单步(逐语句)调试,会进入到函数内部执行
    5. next: 单步(逐语句)调试,但不会进入到函数内部执行
    6. finish: 结束当前函数或循环
    7. continue: 执行到下个断点或程序结束
    8. up <N>: 往栈顶移动N帧,N默认为1
    9. down <N>: 往栈顶移动N帧,N默认为1
    10. list: 打印当前点附近的代码
    11. print <name>: 打印名为name的变量值
    12. print *<name>: 打印name指针指向的值
    13. print/x <name>: 以16进制打印name的值
    14. print <name>@<n>: 打印以name为起始地址的n个值
    15. break <name>: 在函数name处设置断点
    16. break <num>: 在行num处设置断点
    17. disable 1: 去使能断点1
    18. enable 1: 使能断点1
    19. delete 1: 删除断点1
    20. delete: 删除所有断点
    21. condition 1 <expr>: 断点1的停止条件为表达式expr为true
    22. condition 1: 删除断点1的所有条件
    23. info break: 显示所有的断点信息
    24. backtrace: 查看栈信息
    25. display <name>: 始终显示变量name的值
    26. undisplay <name>: 取消跟踪name的值
    27. watch <expr>: 监视expr的值,一旦有变化就暂停程序

    参考资料:

  3. gdb调试的原理是?

    参考答案

    gdb使用系统调用ptrace(process trace)去观察和控制其它进程的执行、检查和修改其它进程的内存和寄存器。ptrace的原型如下:

    long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
    

    根据ptrace的manual手册,主要有两种跟踪进程的方式:

    1. 父进程通过fork系统调用创建子进程,在子进程中作如下ptrace调用,然后再通过execv加载子进程程序。

      ptrace(PTRACE_TRACEME, 0, 0, 0);
      
    2. 使用如下ptrace调用直接跟踪其它进程:

      ptrace(PTRACE_ATTACH, pid, 0, 0);
      

    当进程被跟踪时,每当有信号(signal)被分发给被跟踪的进程(tracee)时都会导致tracee暂停(SIGKILL是个例外)。进行跟踪的进程(tracer)通过waitpid系统调用(或类似的wait相关的系统调用)获知tracee被跟踪的情况。当tracee停止时,tracer还可以使用多种ptrace request去检查或修改tracee

    gdb断点(breakpoint)功能的软件实现原理是在指定位置插入断点指令(INT),当被调试的程序执行到断点位置时,产生SIGTRAP信号并转由gdb处理。

    参考资料:

  4. 如何调试多进程程序?

    参考答案

    当我们使用gdb调试多进程程序时,如果进程使用fork创建了子进程,gdb仍会继续跟踪原来的进程,子进程正常执行。要想允许调试子进程,有两种方法:

    1. 使用attch pid的方式跟踪子进程,其中pid为子进程的进程ID
    2. gdb中使用set follow-fork-mode配置fork时跟踪子进程还是父进程

    参考资料:

  5. 如何调试多线程程序?

    参考答案

    gdb提供以下功能调试多线程程序:

    1. 新线程创建的自动提醒
    2. thread <threadno>命令用于在调试的进程间切换
    3. info threads命令用于查询所有已存在的线程
    4. thread apply <threadno> <all> args命令用于对指定的一条线程或多条指令应用指令
    5. 用于线程的断点

    需要注意的是,threadnogdb为每个线程分配的线程ID,是一个内部ID

    参考资料:

  6. 什么是core文件?有什么作用?

    参考答案

    core文件指core dump file,是操作系统在进程收到某些信号而终止时,将此时进程空间的内容及有关进程的状态的其它信息写入一个磁盘文件。core文件中的信息一般用于调试。 程序自身的core dump file一般可以用于分析程序是在哪里错了,而外部程序触发的core dump file一般来于分析进程的运行情况,比如分析内存使用、线程状态等。 core dump的缺点有:

    1. 性能问题:对进程进行core dump可能会耗费大量系统资源、造成内存清理的延迟,尤其是占用大量内存的进程。
    2. 磁盘空间问题:对进程进行core dump会占用大量磁盘空间。
    3. 安全问题:core文件可能包含敏感数据(如密码和密钥),这部分敏感数会被写入到磁盘。

    Linux上要去使能core dump功能,有以下方式:

    1. 使用sysctl设置kernel.core_pattern的值为/dev/null
    2. 按如下方式配置/etc/systemd/coredump.conf.d/custom.conf:
     ```
    
     [Coredump]
     Storage=none
     ```
    

    3. 按如下方式配置/etc/security/limits.conf:

     ```
     * hard core 0
     ```
    

    4. 使用ulimit指令:ulimit -c 0

    使用gdb对已有进程生成core dump file的方式为:

    1. gdb -p <pid>启动对进程的调试,其中<pid>为进程的进程ID
    2. gdb中使用指令generate-core-file生成core dump file

    参考资料:

  7. 如何使用GDB进行远程调试?

    参考答案

    使用GDB进行远程调试通常需要以下步骤:

    1. 准备目标设备和调试主机:
      • 确保目标设备和调试主机在同一网络中,并可以相互通信。
      • 在目标设备上安装并运行GDB服务器软件,例如OpenOCD、J-Link GDB Server等。
      • 在调试主机上安装GDB调试器。
    2. 启动GDB服务器:
      • 在目标设备上运行GDB服务器,配置它以监听特定的端口,例如TCP端口。
    3. 连接到目标设备:
      • 在调试主机上打开终端或命令行界面,启动GDB调试器。
      • 使用GDB的"target remote"命令连接到目标设备的IP地址和端口,例如:target remote <target_ip_address>:<port>
    4. 加载和调试程序:
      • 使用GDB的"file"命令加载目标设备上的可执行文件,例如:file <executable_file>
      • 设置断点、单步执行或其他调试操作,以控制程序的执行。
      • 使用GDB的其他命令进行调试,例如查看变量、回溯函数调用等。

    需要注意的是,远程调试的具体步骤可能因目标设备和调试工具的不同而有所差异。建议参考相关的GDB调试器和GDB服务器的文档,以了解更详细的配置和使用说明。

    参考资料:

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-29 17:30
找实习找着找着就要进入7月了,马上秋招也要开始了,找实习还有意义吗?
绝迹的星:有面就面, 没面上就当日薪4位数大佬免费培训, 面上了再考虑要不要实习
点赞 评论 收藏
分享
字节一直是我的白月光,考虑到转正还是拒了日常实习。
从明天开始狠狠卷JV...:为什么你释放的offer没流到我头上
点赞 评论 收藏
分享
二月份来北京实习,虽然提前做了攻略,但是是人生第一次经历租房,全程自己搞定,所以难免还是踩坑了😅奉劝大家,租房不要只看自己的房间如何,还要看别人的房门口环境如何因为我就是那个倒霉蛋,我旁边房间额门口堆了一大堆杂物,都是另一个房间的人放在外面的,而且他门口放了几十双鞋子,冬天还好,现在是夏天,可太味了,怎么有这么多鞋啊啊啊啊,请看图片O(≧口≦)O一开始这屋里是一个人住,后来变成两个人住(他说他妈妈来北京看病暂时住,ok能体谅的)但是大概一个多月以后他妈妈回家了,无缝衔接了一位女朋友接着住,而且他的女朋友巨能买东西,我真的不得不吐槽,🥲我不管别人怎么花钱的,但是你买东西你起不来,你能不能换个时间约送上门,总是在周内或者周末的某一天早上七点多,没到起来的时间,快递员框框敲门了!!!!而且经常点外卖但是我们楼下有门禁,外卖员按响铃他俩不去解锁,一直等一直等,等到我们其他人受不了去帮解锁,吵得要死,他们像聋了一样!!!服啦!!!我的房租一个月不到1600,但是是阳隔,很不隔音,隔壁的大哥有时候会半夜吃薯片或者嗑瓜子(凌晨两三点的时候)好几次我都从梦里被嗑出来了🥲还好还剩两个月就实习结束可以回家了,呜呜想家,想我自己的窝😭
码农索隆:这也是我不喜欢合租的原因
我的租房踩坑经历
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
1
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务