首页 > nginx, 源码分析 > 快速定位指针函数名称

快速定位指针函数名称

2011年9月10日 发表评论 阅读评论 3,646 次浏览

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

rev->handler(rev);
ls->handler(c);
…

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

ls->handler(c);

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

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)被执行。查看我们的日志信息,我这是默认位置:

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

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

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

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

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://www.lenky.info/archives/2011/09/65http://lenky.info/?p=65


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

分类: nginx, 源码分析 标签: ,
  1. 2014年4月21日12:24 | #1

    很好,谢谢分享

  2. 2013年5月31日23:51 | #2

    addr2line,神器,早知道有这样好使的工具就不会走那么多弯路了,谢谢分享

  1. 本文目前尚无任何 trackbacks 和 pingbacks.