vs2013 调试libevent 源码

时间:2022-12-28 00:15:16

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

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

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

源码目录即可源码调试。 

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

vs2013 调试libevent 源码

 

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 = 0; i < 3; 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 = 0; j < 50; 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 

将 

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

改为 

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

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

 

 

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

vs2013 调试libevent 源码

编译生成:

vs2013 调试libevent 源码

 

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

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

 vs2013 调试libevent 源码

 

 

vs2013 调试libevent 源码

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

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

vs2013 调试libevent 源码

  所在目录

 

5、源码跟踪调试

vs2013 调试libevent 源码

F11跳入源码调试:

vs2013 调试libevent 源码

 

附上测试代码:

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

 

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

  如有转载,请注明出处。