用gdb+nm调试php c extension程序
来源:互联网 发布:f660 telnet 23端口 编辑:程序博客网 时间:2024/04/29 22:54
最近在写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中加上下面的配置信息
if test -z "$PHP_DEBUG"; then
AC_ARG_ENABLE(debug,
[
--enable-debug compile with debugging symbols
],[
PHP_DEBUG=$enableval
],[
PHP_DEBUG=no
])
fi
./configure –enable-debug --enable-yourmodule //和调试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 命令参考)。
[#bash#]gdb
(gdb) file ~/php/bin/php
4.break设置断点,运行php脚本进行调试
都准备就绪了,设置断点吧,用从nm查看到的符号。设置好就run吧: run *.php 这条命令是将.php脚本作为参数传递给php解释器,让php解释器执行*.php脚本,并在断点处停止。然后就list, print, next把bug都找出来吧。
设置断点时一定要选择y,因为断点是设置在扩展so里面,必须load之后才能才能找到。
其他的就和调试c程序是一样的步骤了。祝大家调的开心^_^
- 用Gdb+Nm调试Php C Extension程序
- 用gdb+nm调试php c extension程序
- 用gdb+nm调试php c extension程序
- 用gdb+nm调试php c extension程序
- [转]用gdb+nm调试php c extension程序
- gdb + nm 调试php扩展
- 用gdb调试php程序
- 用gdb调试php程序
- 用GDB调试C程序
- C GDB 调试程序
- 用 gdb 调试 C/C++ 程序
- 用gdb调试C与C++程序
- 用gdb调试c程序 初步 (1)
- linux下用gdb调试c程序
- 用gdb调试C与C++程序
- 用GDB调试c/c++程序
- 用GDB调试C程序命令集锦
- 用gdb调试C与C++程序
- getenv()
- jquery实现复选框的全选和反选
- android camera mtbf 脚本
- zencart初始安装后台目录admin必须修改才能登录问题
- SNMP的应用
- 用gdb+nm调试php c extension程序
- poj 2135 Farm Tour--最小费用最大流--邻接表--构图的时候注意退边--以及退边的算法
- sql server 2008 客户端突然不能连上服务器 要重启
- Android launchMode
- Android OpenGL ES 简明开发教程三:3D绘图基本概念
- oracle 11g 自动内存管理。
- shell 变量赋值和替换
- 用JAVA代码实现ARP攻击
- 服务器数据库系列 - Redis几个认识误区