您现在的位置:首页 --> 查看专题: GDB
某Team在用Python开发一些代码,涉及子进程以及设法消除僵尸进程的需求。实践中他们碰上Python程序非预期退出的现象。最初他们决定用GDB调试Python解释器,查看exit()的源头。我听了之后,觉得这个问题应该用别的调试思路。帮他们排查这次程序故障时,除去原始问题,还衍生了其他问题。
这次的问题相比西安研发中心曾经碰上的Python信号处理问题,有不少基础知识、先验知识是共用的,此处不做再普及,感兴趣的同学可以翻看我以前发过的文章。
下文是一次具体的调试、分析记录。为了简化现场、方便调试,已将原始问题、衍生问题浓缩成DebugPythonWithGDB_6.py、DebugPythonWithGDB_7.py。
计算机在分配变量的时候, 局部变量是存储在栈中, 全局变量是存储在全局量段。进入函数时, 变量会放到栈顶,退出时会从栈顶拿掉。它是从存储器顶部开始向下增长的。
启动 GDB 的时候, 一定要保证加了 -g 来增加代码到二进制文件中来. 代码是在指定路径,所以代码文件不存在并不行。
GDB(GNU debugger)是GNU开源组织发布的一个强大的UNIX下的程序调试工具。可以使用它通过命令行的方式调试程序。它使你能在程序运行时观察程序的内部结构和内存的使用情况。你也可以使用它分析程序崩溃前的发生了什么,从而找出程序崩溃的原因。相对于windows下的图形界面的VC等调试工具,它提供了更强大的功能。如果想在Windows下使用gdb,需要安装MinGW或者CygWin,并且需要配置环境变量才可以使用。
下面介绍我调试时经常遇到的三种问题,如果大家也有类似的问题交流一下解决方法:
情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序
情景2:需要同时看几个变量的值或者批量查看多个core文件的堆栈信息怎么办
情景3:遇到需要查看、队列、链表、树、堆等数据结构里的变量怎么办
还是面某M的时候,面试官问我:“用过gdb么?” 答:“用过,调了两年bug了”。“那好,给我解释下gdb是怎么工作的?或者说跟内核什么地方有关系?”。 是阿,gdb凭什么可以调试一个程序?凭什么能够接管一个程序的运行?我以前也想过这样的问题,但是后来居然忘记去查看了。我想到了我们的二进制翻译器,想到了intel的pin,Dynamo。这些都是将翻译后的代码放到codecache中去运行,然后接管整个程序的执行。gdb是不是也一样呢? 如果真是这样,为什么我记得用gdb跑一个程序,这个程序会有一个单独的进程?gdb的attach功能又是怎么实现的? 想了想,我还是没有答上来。面试就是由这么一个又一个细节的小杯具最后汇集成一个大杯具。 那么,gdb到底是凭什么接管的一个进程的执行呢?其实,很简单,通过一个系统调用:ptrace。
以前, 我曾经介绍过如何通过PHP的Core文件获取信息:如何调试PHP的Core之获取基本信息, 对于调用参数这块, 当时介绍的获取方法比较复杂. 于是今天我为PHP 5.4的.gdbinit做了一个改进, 以后如果你遇到了PHP 5.4的core, 那么就可以简单的得到PHP 5.4发生Core时, 包括参数的函数调用栈的信息.
分享两个GDB的小技巧: 1, GDB失效时手工得到stack; 2, GDB执行用户命令脚本; 调试内存型服务程序的有时会遇到core dump或死锁问题,且gdb或者pstack都无法显示调用栈(call stack)。这是因为线程的调用栈被破坏了,而调用栈存放了函数的返回地址,gdb解析函数返回地址(根据地址查找符号表)失败,gdb也没有进行容错处理,只要有一处地址解析失败就无法展开调用栈。然而幸运的是,调用栈往往只是部分被破坏,RSP堆栈寄存器中保...
七、八年前写过一篇《用GDB调试程序》,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题。这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来。希望大家补充。 一、多线程调试 多线程调试可能是问得最多的。其实,重要就是下面几个命令: info thread 查看当前进程...
在学习Nginx源码的过程中碰到一个问题使用GDB调试Nginx的时候每次在Nginx主程序启动master之后主进程就被deattache了.然后整个GDB退出这样我们就没法看到最主要的事情的经过了. 因为主要的进程管理,事件处理等等事情, 都是发生在fork出来的master以及再后面的worker进程中的好在IBM developer works上一直有绝好的文章这篇使用 GDB 调试多进程程序就是专门讲述GDB调试多进程程序的三个方法的 1.使用follow-fork-mode和set d...
因为工作用到.所以写这个东西留着以后防止忘记关于各个指令我会重新表述一下作用,尽量简单易懂要完整的说明可以网上搜,但是大多抄来抄去没太大意思 start - 开始调试,并且自动在main开始处中断(break) b [函数名] - 在指定函数处设置断点 b [文件名]:[行数] - 在指定文件的行数处设置断点 b [文件名]:[函数名] - 在指定文件的函数处设置断点 s - 执行下一步语句,如果有函数就跳进去继续执行 n - 执行下一步语句,不会...
[ 共10篇文章 ][ 第1页/共1页 ][ 1 ]
近3天十大热文
- [69] Twitter/微博客的学习摘要
- [67] IOS安全–浅谈关于IOS加固的几种方法
- [66] 如何拿下简短的域名
- [65] android 开发入门
- [63] find命令的一点注意事项
- [62] Go Reflect 性能
- [61] 流程管理与用户研究
- [60] Oracle MTS模式下 进程地址与会话信
- [59] 图书馆的世界纪录
- [57] 读书笔记-壹百度:百度十年千倍的29条法则
赞助商广告