用gdb+nm调试php c extension程序

标签: BugFix CDN c extension gdb nm | 发表时间:2011-10-20 09:13 | 作者:千石 ndv
出处:http://rdc.taobao.com/blog/cs

最近在写Beanstalkd的php c extension客户端程序,写程序离不开调试,下面把调试中碰到的问题和解决方法和大家分享一下。

.so写好了是给php脚本调用的,如果php脚本执行崩掉了,.so也只能在进程中饮恨而终,这时候php脚本调试经常用的echo, print_r, var_dump都派不上用场了。即使能打印一点儿错误log出来,但也是只见表象,不知内情,根本解决不了一些诡异的bug。还好我们有gdb,下面就通过4步搞定php c extension的调试。

1.准备可调试的.so

在config.m4中加上下面的配置信息

./configure –enable-debug      //和调试c程序的-g是一样的效果

make                                        //生成带调试信息的.so

make install                             //安装.so到php解释器可以加载的路径

2.通过nm查看

要调试就要设置断点,要设置断点就要知道符号,php扩展中为了保证函数不和c库中的符号重复,在导出函数前都加上统一前缀zif,为了知道待调试.so都有哪些符号,nm命令再合适不过了。nm命令用来列出目标文件(.a或.so)的符号清单,包含函数或类名,如下图:

3.加载php解释器和.so到gdb

是时候加载php解释器到gdb下了,这要用到gdb的file命令:file /usr/bin/php 这里的php解释器不需要有调试符号,但要确保其加载了待调试的.so(可以通过php –m 命令参考)。

 4.break设置断点,运行php脚本进行调试

都准备就绪了,设置断点吧,用从nm查看到的符号。设置好就run吧: run *.php 这条命令是将.php脚本作为参数传递给php解释器,让php解释器执行*.php脚本,并在断点处停止。然后就list, print, next把bug都找出来吧。

设置断点时一定要选择y,因为断点是设置在扩展so里面,必须load之后才能才能找到。

其他的就和调试c程序是一样的步骤了。祝大家调的开心^_^

相关 [gdb nm 调试] 推荐:

用gdb+nm调试php c extension程序

- ndv - 淘宝核心系统团队博客
最近在写Beanstalkd的php c extension客户端程序,写程序离不开调试,下面把调试中碰到的问题和解决方法和大家分享一下. .so写好了是给php脚本调用的,如果php脚本执行崩掉了,.so也只能在进程中饮恨而终,这时候php脚本调试经常用的echo, print_r, var_dump都派不上用场了.

gdb调试工具

- - CSDN博客系统运维推荐文章
查看帮助一是man 命令,二是进入 www.gnu.org,找到gdb的帮助文档(更详细). gcc -Wall -g main.c -o main,只有这样才能产生调试信息,包括core的调试信息.     run(r)  运行,执行到断点,重新用r,表示重新开始执行.     list(l)  列出源代码,l 2,l main,l 2,16(数字表示行数).

Linux下gdb调试

- - CSDN博客移动开发推荐文章
关于gdb的其他客套话不多说,直接进入正题. 列出产生执行文件源代码的一部分. 执行一行源代码但不进入函数内部. 执行一行源代码而且进入函数内部. 监视一个变量的值,一旦值有变化程序停住. 1.新建一个源文件vi yrp.cc,源代码如下:. 2.生成可执行文件 g++ -g -o yrp yrp.cc  注意必须使用-g参数,编译会加入调试信息,否则无法调试执行文件..

[转]GDB调试多线程

- - 小彰
GDB 多线程调试基本命令 实现简介 以及一个问题的解决. 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 切换当前调试的线程为指定ID的线程.

Linux下进行GDB调试

- - CSDN博客推荐文章
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具. 一般来说,GDB主要帮助自己完成下面四个方面的功能;. 1:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2:可以让被调试的程序在你所指定的调制的断点处停住(断点可以是条件表达式). 3:当程序被停住时,可以检查你的程序中发生的事.

GDB学习之道:GDB调试精粹及使用实例

- - CSDN博客系统运维推荐文章
要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、. 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的. 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表.

使用 gdb 调试 Python 进程

- yinseny - python.cn(jobs, news)
有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump. 例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到哪行Python代码呢. 这时就需要祭出gdb这个神器了. 确认你的gdb版本是>=7,gdb从版本7开始支持对Python的debug.

GDB调试精粹及使用实例

- - CSDN博客推荐文章
当出现EXE_BAD_ACCESS, SIGABRT 及其他Crash时可以尝试用:. 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、. 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的.

[C++] gdb高级调试方法

- - CSDN博客推荐文章
1,启动gdb的时候自动执行脚本. 注意:your_script里面只能有gdb命令. 不过我们都知道gdb命令里面有个shell指令,所以实际上这里可以做任何事. 在gdb里面有个attach指令,可以调试运行中的进程. 结合上面的-x参数,实际上我们可以写一个脚本,自动的attach到我们关心的进程上面,然后自动的做很多事情:比如设置trace命令并且continue.

用gdb调试游戏服务端

- - CSDN博客编程语言推荐文章
一般来说,提到gdb,都是用命令来调试. “命令”,这个对于用户来说几乎等同于繁杂的词语. 尽管事实确实如此,但实际的开发调试必须用到gdb. 现在,大多数Linux系统是存在于服务器当中. 我们想操作这些系统时,一般是通过Terminal来操作. 也就是说这些Linux系统不具有图形界面. 而调试一般分两部分,开发时调试和运行时调试.