用gdb+nm调试php c extension程序

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

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解释器可以加载的路径

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

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

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

(gdb) file ~/php/bin/php

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

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

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

用gdb+nm调试php c extension程序

时间: 2024-10-09 04:18:30

用gdb+nm调试php c extension程序的相关文章

linux下 gdb+coredump 调试偶发crash的程序

1. 打开 core dump 查看是否打开 ulimit -c 如果输出0, 说明没有打开. 方法一:使用命令 ulimit -c unlimited 可以打开,但是只对当前终端有效, 方法二: 配置 /etc/profile 文件 sudo gedit /etc/profile 在最后添加一行 ulimit -S -c unlimited > /dev/null 2>&1 可以始终打开core dump , unlimited 可以改为具体的数字,比方说 1024 来限制 core

gdb调试运行时的程序小技巧

使用gdb调试运行时的程序小技巧 标签: 未分类 gdb pstack | 发表时间:2012-10-15 04:32 | 作者:士豪 分享到: 出处:http://rdc.taobao.com/blog/cs 原创文章,欢迎转载.转载请注明:转载自淘宝核心系统团队博客,谢谢! 原文链接地址: 使用gdb调试运行时的程序小技巧 下面介绍我调试时经常遇到的三种问题,如果大家也有类似的问题交流一下解决方法: 情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序 情景2:需要同时看几个变量的值或

使用 GNU GCC 和 GDB 开发调试应用程序

gcc 命令的使用 在使用GCC编译程序时,编译过程可以被细分为四个阶段: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 如果不加任何参数, gcc 默认执行所有的操作,直接生成可执行文件. 以上四个阶段对应参数为: 1.        -E  只执行预处理 2.        –S  只编译,不汇编和链接 3.        –c  编译汇编不链接 4.        –o  链接成目标文件 GCC常用选项 -c 通知

windows下使用MinGW的调试工具gdb.exe调试C程序

1.编译源代码 C:MinGW\bin>gcc.exe -g -o program.exe program.c 编译选项上要加上“g”,这样生成的目标程序会含有调试内容,再用gdb调试的时候才能使用.显然加上“g”选项生成的应用程序会比不加的大,但两者运行时没有差别. 2.启动调试 C:MinGW\bin>gdb.exe program.exe 3.设置断点并启动运行 (gdb)break main(gdb)start 不能直接start,因为程序运行太快了,直接start就运行到程序停止的地

[转]使用gdb调试运行时的程序小技巧

原创文章,欢迎转载.转载请注明:转载自淘宝核心系统团队博客,谢谢!原文链接地址:使用gdb调试运行时的程序小技巧 下面介绍我调试时经常遇到的三种问题,如果大家也有类似的问题交流一下解决方法:情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序情景2:需要同时看几个变量的值或者批量查看多个core文件的堆栈信息怎么办情景3:遇到需要查看.队列.链表.树.堆等数据结构里的变量怎么办1. 情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序我们在生产环境或者测试环境,会遇到一些异常,我们需

用GDB远程调试android native程序

上次写了几个native程序,想着如何调试,经过一阵子搜索和测试,终于完成了.有几个关键点: 1 gdb和gdbserver 因为这两个需要配套,建议使用同一个ndk下面的gdb和gdbserver gdbserver的是在 android-ndk-r9\prebuilt\android-arm\gdbserver 这个目录下 gdb 是在 android-ndk-r9\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bi

gdb调试带参数的程序

gdb调试带参数的程序 解决方案: gdb --args ./app arg1 arg2 

针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调试,从而获得程序运行状态下的信息( 关闭 ALSR 机制 ),基础的 gdb 操作可参见笔者的文章Linux下编辑.编译.调试命令总结--gcc和gdb描述.使用 gdb 可以方便的获取程序动态运行状态下的信息,但通过 gdb 动态调试获取的诸如缓冲区的起始地址等信息可能与程序实际运行时的信息并不相

使用gdb+gdbserver调试应用程序

目录 一.gdb基本使用 1. 启动gdb 2. gdb交互式命令 二.gdb + gdbserver 实现远程调试 一.gdb基本使用 ? GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. 对于一名Linux下工作的c++程序员,gdb是必不可少的工具: 1. 启动gdb ? 对于C/C++程序,编译的时候需要加上 -g 参数生成调试信息.如:gcc -g hello.c -o hello 调试可执行程序 $gdb 程序名称 $gdb