快速定位指针函数名称

这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。
nginx中应用了大量的指针,函数指针也不例外,到处可见,比如:

1
2
3
rev->handler(rev);
ls->handler(c);

这样的回调处理大大增加了我们阅读/理解nginx源码的难度,因为一下子根本就不知道(或者说很难)这个函数指针指向的到底是哪个函数,有没有方便的办法快速知道这个函数指针指向的是哪个函数呢?有,看看下面的实例:
看下ngx_event_accept.c源文件的函数ngx_event_accept(ngx_event_t *ev),这是一个在nginx监听描述符接收到客户端请求建立连接时将调用的一个函数,该函数的具体作用就先不详述,不过其最后有这么一句代码可用作我们的示例:

1
ls->handler(c);

这个handler指针指向的是哪个函数呢?
两步:
第一:获得该指针值,这可以通过打印调试信息获得,比如在ls->handler(c);下添加这么一句调试信息:

1
ngx_log_debug(NGX_LOG_DEBUG_EVENT, log , 0, "ls->handler:0X%p" , ls->handler);

修改了源代码,当然要make;make install;
然后启动nigix(注意打开调试选项),然后我们执行一次请求动作,即使得函数ngx_event_accept(ngx_event_t *ev)被执行。查看我们的日志信息,我这是默认位置:

1
/usr/local/nginx/logs/error. log

可以找到我们的指针值打印信息如下:

1
2009/11/19 23:39:25 [debug] 6202#0: *1 ls->handler:0X0806FA72

第二:在合适的目录执行合适的命令,如下:

1
2
3
4
5
lenky@lenky-desktop:/usr/local/nginx/sbin$ ls
nginx  nginx.old
lenky@lenky-desktop:/usr/local/nginx/sbin$ addr2line -e nginx -f 0X0806FA72
ngx_http_init_connection
/home/lenky/nginx/nginx-0.6.36/src/http/ngx_http_request.c:175

可以看到,ls->handler指向的是ngx_http_init_connection函数,并且该函数所在的源文件和行数也一并列出来了。熟练的话,这总个过程不会超过30秒。还算不错吧?
关于addr2line命令,大家Google一下吧。

转载请保留地址:http://lenky.info/2011/09/10/%e5%bf%ab%e9%80%9f%e5%ae%9a%e4%bd%8d%e6%8c%87%e9%92%88%e5%87%bd%e6%95%b0%e5%90%8d%e7%a7%b0/http://lenky.info/?p=65

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值