自己内功的提升,无非是向前辈学习和修炼自身,对于编码也是如此,学习优秀的库只有从

源代码学起,才能深刻理解库实现的来龙去脉,加深自己的理解,提升自己的功力。

今天就介绍一下vs2013 下面调试libevent源码。不需要创建sln解决方案,只需要创建工程,包含

源码目录即可源码调试。

1、手工添加print-winsocke-errors.c文件,不然nmake编译的时候会报错。

print-winsocke-errors.c源代码程序:

  1. #include <winsock2.h>
  2. #include <windows.h>
  3.  
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6.  
  7. #include "event2/event.h"
  8. #include "event2/util.h"
  9. #include "event2/thread.h"
  10.  
  11. #define E(x) printf (#x " -> \"%s\"\n", evutil_socket_error_to_string (x));
  12.  
  13. int main (int argc, char **argv)
  14. {
  15. int i, j;
  16. const char *s1, *s2;
  17.  
  18. #ifdef EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED
  19. evthread_use_windows_threads ();
  20. #endif
  21.  
  22. s1 = evutil_socket_error_to_string (WSAEINTR);
  23.  
  24. for (i = ; i < ; i++) {
  25. printf ("\niteration %d:\n\n", i);
  26. E(WSAEINTR);
  27. E(WSAEACCES);
  28. E(WSAEFAULT);
  29. E(WSAEINVAL);
  30. E(WSAEMFILE);
  31. E(WSAEWOULDBLOCK);
  32. E(WSAEINPROGRESS);
  33. E(WSAEALREADY);
  34. E(WSAENOTSOCK);
  35. E(WSAEDESTADDRREQ);
  36. E(WSAEMSGSIZE);
  37. E(WSAEPROTOTYPE);
  38. E(WSAENOPROTOOPT);
  39. E(WSAEPROTONOSUPPORT);
  40. E(WSAESOCKTNOSUPPORT);
  41. E(WSAEOPNOTSUPP);
  42. E(WSAEPFNOSUPPORT);
  43. E(WSAEAFNOSUPPORT);
  44. E(WSAEADDRINUSE);
  45. E(WSAEADDRNOTAVAIL);
  46. E(WSAENETDOWN);
  47. E(WSAENETUNREACH);
  48. E(WSAENETRESET);
  49. E(WSAECONNABORTED);
  50. E(WSAECONNRESET);
  51. E(WSAENOBUFS);
  52. E(WSAEISCONN);
  53. E(WSAENOTCONN);
  54. E(WSAESHUTDOWN);
  55. E(WSAETIMEDOUT);
  56. E(WSAECONNREFUSED);
  57. E(WSAEHOSTDOWN);
  58. E(WSAEHOSTUNREACH);
  59. E(WSAEPROCLIM);
  60. E(WSASYSNOTREADY);
  61. E(WSAVERNOTSUPPORTED);
  62. E(WSANOTINITIALISED);
  63. E(WSAEDISCON);
  64. E(WSATYPE_NOT_FOUND);
  65. E(WSAHOST_NOT_FOUND);
  66. E(WSATRY_AGAIN);
  67. E(WSANO_RECOVERY);
  68. E(WSANO_DATA);
  69. E(0xdeadbeef); /* test the case where no message is available */
  70.  
  71. /* fill up the hash table a bit to make sure it grows properly */
  72. for (j = ; j < ; j++) {
  73. int err;
  74. evutil_secure_rng_get_bytes(&err, sizeof(err));
  75. evutil_socket_error_to_string(err);
  76. }
  77. }
  78.  
  79. s2 = evutil_socket_error_to_string (WSAEINTR);
  80. if (s1 != s2)
  81. printf ("caching failed!\n");
  82.  
  83. libevent_global_shutdown ();
  84.  
  85. return EXIT_SUCCESS;
  86. }

2、修改Makefile.nmake 

  1. CFLAGS=$(CFLAGS) /Ox /W3 /wd4996 /nologo

改为

  1. CFLAGS=$(CFLAGS) /Od /W3 /wd4996 /nologo /Zi

使用/Od禁止优化,使用/Zi 生成调试信息。

3、vs2013命令行编译:nmake /f Makefile.nmake

编译生成:

4、新建工程,附加源码调试

解决方案包含源代码目录:

  以上三个目录添加到VC的附加库目录。

    lib包含目录添加刚才生成的

  所在目录

5、源码跟踪调试

F11跳入源码调试:

附上测试代码:

  1. // libevent-test.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #pragma comment(lib,"ws2_32.lib")
  7. #pragma comment(lib,"wsock32.lib")
  8. #pragma comment(lib,"libevent.lib")
  9. #pragma comment(lib,"libevent_core.lib")
  10. #pragma comment(lib,"libevent_extras.lib")
  11.  
  12. #include <sys/types.h>
  13.  
  14. #include <event2/event-config.h>
  15.  
  16. #include <sys/stat.h>
  17. #ifndef _WIN32
  18. #include <sys/queue.h>
  19. #include <unistd.h>
  20. #endif
  21. #include <time.h>
  22. #ifdef EVENT__HAVE_SYS_TIME_H
  23. #include <sys/time.h>
  24. #endif
  25. #include <fcntl.h>
  26. #include <stdlib.h>
  27. #include <stdio.h>
  28. #include <string.h>
  29. #include <errno.h>
  30.  
  31. #include <event2/event.h>
  32. #include <event2/event_struct.h>
  33. #include <event2/util.h>
  34.  
  35. #ifdef _WIN32
  36. #include <winsock2.h>
  37. #endif
  38.  
  39. struct timeval lasttime;
  40.  
  41. int event_is_persistent;
  42.  
  43. static void
  44. timeout_cb(evutil_socket_t fd, short event, void *arg)
  45. {
  46. struct timeval newtime, difference;
  47. struct event *timeout = (struct event *)arg;
  48. double elapsed;
  49.  
  50. evutil_gettimeofday(&newtime, NULL);
  51. evutil_timersub(&newtime, &lasttime, &difference);
  52. elapsed = difference.tv_sec +
  53. (difference.tv_usec / 1.0e6);
  54.  
  55. printf("timeout_cb called at %d: %.3f seconds elapsed.\n",
  56. (int)newtime.tv_sec, elapsed);
  57. lasttime = newtime;
  58.  
  59. if (!event_is_persistent) {
  60. struct timeval tv;
  61. evutil_timerclear(&tv);
  62. tv.tv_sec = ;
  63. event_add(timeout, &tv);
  64. }
  65. }
  66.  
  67. int
  68. main(int argc, char **argv)
  69. {
  70. struct event timeout;
  71. struct timeval tv;
  72. struct event_base *base;
  73. int flags;
  74.  
  75. #ifdef _WIN32
  76. WORD wVersionRequested;
  77. WSADATA wsaData;
  78.  
  79. wVersionRequested = MAKEWORD(, );
  80.  
  81. (void)WSAStartup(wVersionRequested, &wsaData);
  82. #endif
  83.  
  84. if (argc == && !strcmp(argv[], "-p")) {
  85. event_is_persistent = ;
  86. flags = EV_PERSIST;
  87. }
  88. else {
  89. event_is_persistent = ;
  90. flags = ;
  91. }
  92.  
  93. /* Initalize the event library */
  94. base = event_base_new();
  95.  
  96. /* Initalize one event */
  97. event_assign(&timeout, base, -, flags, timeout_cb, (void*)&timeout);
  98.  
  99. evutil_timerclear(&tv);
  100. tv.tv_sec = ;
  101. event_add(&timeout, &tv);
  102.  
  103. evutil_gettimeofday(&lasttime, NULL);
  104.  
  105. event_base_dispatch(base);
  106.  
  107. return ();
  108. }

  以上就是vs2013下的源码跟踪调试,下面就开始对libevent深入学习了。

  如有转载,请注明出处。

vs2013 调试libevent 源码的更多相关文章

  1. VS2013 调试MVC源码[MVC5.2.3+MVC4Web项目]

    1.目前MVC源码版本为5.2.3,下回来后用VS2013打开,把System.Web.Mvc项目的版本号改为4.0.0.1 2.在解决方案下建一个MVC4项目,.NET选4.5,修改根目录以及Vie ...

  2. 查看和调试Qt源码

    简述 在调试程序的时候,有时需要调试进入 Qt 源码,这不仅有利于我们了解内部实现机制,而且对于解决一些隐蔽性问题很有帮助. 都知道 F11 是“单步进入”,可是在调试的过程中,按下 F11 却无法进 ...

  3. 查看和调试Qt源码(动态编译的QT也可进入源码)good

    简述 在调试程序的时候,有时需要调试进入 Qt 源码,这不仅有利于我们了解内部实现机制,而且对于解决一些隐蔽性问题很有帮助. 都知道 F11 是“单步进入”,可是在调试的过程中,按下 F11 却无法进 ...

  4. libevent源码深度剖析十二

    libevent源码深度剖析十二 ——让libevent支持多线程 张亮 Libevent本身不是多线程安全的,在多核的时代,如何能充分利用CPU的能力呢,这一节来说说如何在多线程环境中使用libev ...

  5. 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

    前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...

  6. Android动态方式破解apk进阶篇(IDA调试so源码)

    一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...

  7. Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)

    一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk  主要采用的是静态方式,步骤也很简单,首先使用 ...

  8. 使用VS2012调试ReactOS源码

    目录 一 下载并安装VS2012 二 下载并安装WDK80 三 下载ReactOS0315源码 四 下载并安装RosBE211 五 用RosBE命令行编译ReactOS源码 六 用VS2012编译nt ...

  9. 【转】libevent源码分析

    libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和l ...

随机推荐

  1. SOA和微服务到底是什么关系?

    SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上的区别,两者说到底都是对外提供接口的一种架构设计方式.我倒觉得微服务其实就是随着互联网的发展,复杂的平台.业务的出现, ...

  2. R12 更新对应用户的字符集

    R12 更新对应用户的字符集     症状:应用系统数据导出操作,经常发生导出文件(XLS / TSV)产生简体中文乱码. 方案:针对客户端当前用户进行字符集更新 ZHS16GBK,而不影响其他用户. ...

  3. Javascript Promises 介绍

    什么是 Promises Promises是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口.   传统的回调函数 说到JavaScript的异步编程处理,通常 ...

  4. akka 练手 原来第一次是原封不动的返回传出去的参数

    今天,有介绍akka的文章,就下了个源码的demo练手! 在TimeServer 这个实例中主要就2个文件 server端 static void Main(string[] args) { usin ...

  5. Web 协议 HTTP1.0 HTTP1.1 SPDY HTTP2.0

    Web 协议 HTTP1.0 HTTP1.1 SPDY HTTP2.0 HTTP1.0 VS HTTP1.1 长连接HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而H ...

  6. GlusteFS 二

    通过heketi提供的RestfullApi来管理 Gluster,进而与kubernetes集成.将gluster作为kubernetes的数据存储 1 安装 安装gluster 参见 Gluste ...

  7. 基于Extjs的web表单设计器 第一节

    前面一节介绍了表单设计器的背景和最终的大概样式,本节主要介绍表单设计器的需求及功能设计. 在讲需求之前先明确几个常用的概念: 主表或者卡片表——具有多行多列的一个区域的控件块,如下图所示. 明细表—— ...

  8. PyQt4 QListWidget 使用教程

    转自:http://blog.csdn.net/seeground/article/details/49177387?locationNum=3&fps=1 listWidget = QLis ...

  9. 「ZJOI 2010」 排列计数

    题目链接 戳我 \(Solution\) 其实我们可以发现这题等价于让你求: 用\(1\)~\(n\)的数组成一个完全二叉树使之满足小根堆性质的方案数 于是我们可以考虑\(dp\) 假设我们现在在\( ...

  10. C博客作业06—结构体&指针

    1.本章学习总结 1.1思维导图 1.2本章学习体会 明白了结构体的定义及使用方法 学会了fopen,fclose,feof等文件操作函数,学会使用c语言进行文件操作 大作业中的部分函数出现未知错误且 ...