vs2013 调试libevent 源码
自己内功的提升,无非是向前辈学习和修炼自身,对于编码也是如此,学习优秀的库只有从
源代码学起,才能深刻理解库实现的来龙去脉,加深自己的理解,提升自己的功力。
今天就介绍一下vs2013 下面调试libevent源码。不需要创建sln解决方案,只需要创建工程,包含
源码目录即可源码调试。
1、手工添加print-winsocke-errors.c文件,不然nmake编译的时候会报错。
print-winsocke-errors.c源代码程序:
- #include <winsock2.h>
- #include <windows.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include "event2/event.h"
- #include "event2/util.h"
- #include "event2/thread.h"
- #define E(x) printf (#x " -> \"%s\"\n", evutil_socket_error_to_string (x));
- int main (int argc, char **argv)
- {
- int i, j;
- const char *s1, *s2;
- #ifdef EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED
- evthread_use_windows_threads ();
- #endif
- s1 = evutil_socket_error_to_string (WSAEINTR);
- for (i = ; i < ; i++) {
- printf ("\niteration %d:\n\n", i);
- E(WSAEINTR);
- E(WSAEACCES);
- E(WSAEFAULT);
- E(WSAEINVAL);
- E(WSAEMFILE);
- E(WSAEWOULDBLOCK);
- E(WSAEINPROGRESS);
- E(WSAEALREADY);
- E(WSAENOTSOCK);
- E(WSAEDESTADDRREQ);
- E(WSAEMSGSIZE);
- E(WSAEPROTOTYPE);
- E(WSAENOPROTOOPT);
- E(WSAEPROTONOSUPPORT);
- E(WSAESOCKTNOSUPPORT);
- E(WSAEOPNOTSUPP);
- E(WSAEPFNOSUPPORT);
- E(WSAEAFNOSUPPORT);
- E(WSAEADDRINUSE);
- E(WSAEADDRNOTAVAIL);
- E(WSAENETDOWN);
- E(WSAENETUNREACH);
- E(WSAENETRESET);
- E(WSAECONNABORTED);
- E(WSAECONNRESET);
- E(WSAENOBUFS);
- E(WSAEISCONN);
- E(WSAENOTCONN);
- E(WSAESHUTDOWN);
- E(WSAETIMEDOUT);
- E(WSAECONNREFUSED);
- E(WSAEHOSTDOWN);
- E(WSAEHOSTUNREACH);
- E(WSAEPROCLIM);
- E(WSASYSNOTREADY);
- E(WSAVERNOTSUPPORTED);
- E(WSANOTINITIALISED);
- E(WSAEDISCON);
- E(WSATYPE_NOT_FOUND);
- E(WSAHOST_NOT_FOUND);
- E(WSATRY_AGAIN);
- E(WSANO_RECOVERY);
- E(WSANO_DATA);
- E(0xdeadbeef); /* test the case where no message is available */
- /* fill up the hash table a bit to make sure it grows properly */
- for (j = ; j < ; j++) {
- int err;
- evutil_secure_rng_get_bytes(&err, sizeof(err));
- evutil_socket_error_to_string(err);
- }
- }
- s2 = evutil_socket_error_to_string (WSAEINTR);
- if (s1 != s2)
- printf ("caching failed!\n");
- libevent_global_shutdown ();
- return EXIT_SUCCESS;
- }
2、修改Makefile.nmake
将
- CFLAGS=$(CFLAGS) /Ox /W3 /wd4996 /nologo
改为
- CFLAGS=$(CFLAGS) /Od /W3 /wd4996 /nologo /Zi
使用/Od禁止优化,使用/Zi 生成调试信息。
3、vs2013命令行编译:nmake /f Makefile.nmake
编译生成:
4、新建工程,附加源码调试
解决方案包含源代码目录:
以上三个目录添加到VC的附加库目录。
lib包含目录添加刚才生成的
所在目录
5、源码跟踪调试
F11跳入源码调试:
附上测试代码:
- // libevent-test.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #pragma comment(lib,"ws2_32.lib")
- #pragma comment(lib,"wsock32.lib")
- #pragma comment(lib,"libevent.lib")
- #pragma comment(lib,"libevent_core.lib")
- #pragma comment(lib,"libevent_extras.lib")
- #include <sys/types.h>
- #include <event2/event-config.h>
- #include <sys/stat.h>
- #ifndef _WIN32
- #include <sys/queue.h>
- #include <unistd.h>
- #endif
- #include <time.h>
- #ifdef EVENT__HAVE_SYS_TIME_H
- #include <sys/time.h>
- #endif
- #include <fcntl.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <errno.h>
- #include <event2/event.h>
- #include <event2/event_struct.h>
- #include <event2/util.h>
- #ifdef _WIN32
- #include <winsock2.h>
- #endif
- struct timeval lasttime;
- int event_is_persistent;
- static void
- timeout_cb(evutil_socket_t fd, short event, void *arg)
- {
- struct timeval newtime, difference;
- struct event *timeout = (struct event *)arg;
- double elapsed;
- evutil_gettimeofday(&newtime, NULL);
- evutil_timersub(&newtime, &lasttime, &difference);
- elapsed = difference.tv_sec +
- (difference.tv_usec / 1.0e6);
- printf("timeout_cb called at %d: %.3f seconds elapsed.\n",
- (int)newtime.tv_sec, elapsed);
- lasttime = newtime;
- if (!event_is_persistent) {
- struct timeval tv;
- evutil_timerclear(&tv);
- tv.tv_sec = ;
- event_add(timeout, &tv);
- }
- }
- int
- main(int argc, char **argv)
- {
- struct event timeout;
- struct timeval tv;
- struct event_base *base;
- int flags;
- #ifdef _WIN32
- WORD wVersionRequested;
- WSADATA wsaData;
- wVersionRequested = MAKEWORD(, );
- (void)WSAStartup(wVersionRequested, &wsaData);
- #endif
- if (argc == && !strcmp(argv[], "-p")) {
- event_is_persistent = ;
- flags = EV_PERSIST;
- }
- else {
- event_is_persistent = ;
- flags = ;
- }
- /* Initalize the event library */
- base = event_base_new();
- /* Initalize one event */
- event_assign(&timeout, base, -, flags, timeout_cb, (void*)&timeout);
- evutil_timerclear(&tv);
- tv.tv_sec = ;
- event_add(&timeout, &tv);
- evutil_gettimeofday(&lasttime, NULL);
- event_base_dispatch(base);
- return ();
- }
以上就是vs2013下的源码跟踪调试,下面就开始对libevent深入学习了。
如有转载,请注明出处。
vs2013 调试libevent 源码的更多相关文章
- 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 ...
- 查看和调试Qt源码
简述 在调试程序的时候,有时需要调试进入 Qt 源码,这不仅有利于我们了解内部实现机制,而且对于解决一些隐蔽性问题很有帮助. 都知道 F11 是“单步进入”,可是在调试的过程中,按下 F11 却无法进 ...
- 查看和调试Qt源码(动态编译的QT也可进入源码)good
简述 在调试程序的时候,有时需要调试进入 Qt 源码,这不仅有利于我们了解内部实现机制,而且对于解决一些隐蔽性问题很有帮助. 都知道 F11 是“单步进入”,可是在调试的过程中,按下 F11 却无法进 ...
- libevent源码深度剖析十二
libevent源码深度剖析十二 ——让libevent支持多线程 张亮 Libevent本身不是多线程安全的,在多核的时代,如何能充分利用CPU的能力呢,这一节来说说如何在多线程环境中使用libev ...
- 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码
前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...
- Android动态方式破解apk进阶篇(IDA调试so源码)
一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...
- Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)
一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk 主要采用的是静态方式,步骤也很简单,首先使用 ...
- 使用VS2012调试ReactOS源码
目录 一 下载并安装VS2012 二 下载并安装WDK80 三 下载ReactOS0315源码 四 下载并安装RosBE211 五 用RosBE命令行编译ReactOS源码 六 用VS2012编译nt ...
- 【转】libevent源码分析
libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和l ...
随机推荐
- SOA和微服务到底是什么关系?
SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上的区别,两者说到底都是对外提供接口的一种架构设计方式.我倒觉得微服务其实就是随着互联网的发展,复杂的平台.业务的出现, ...
- R12 更新对应用户的字符集
R12 更新对应用户的字符集 症状:应用系统数据导出操作,经常发生导出文件(XLS / TSV)产生简体中文乱码. 方案:针对客户端当前用户进行字符集更新 ZHS16GBK,而不影响其他用户. ...
- Javascript Promises 介绍
什么是 Promises Promises是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口. 传统的回调函数 说到JavaScript的异步编程处理,通常 ...
- akka 练手 原来第一次是原封不动的返回传出去的参数
今天,有介绍akka的文章,就下了个源码的demo练手! 在TimeServer 这个实例中主要就2个文件 server端 static void Main(string[] args) { usin ...
- 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 ...
- GlusteFS 二
通过heketi提供的RestfullApi来管理 Gluster,进而与kubernetes集成.将gluster作为kubernetes的数据存储 1 安装 安装gluster 参见 Gluste ...
- 基于Extjs的web表单设计器 第一节
前面一节介绍了表单设计器的背景和最终的大概样式,本节主要介绍表单设计器的需求及功能设计. 在讲需求之前先明确几个常用的概念: 主表或者卡片表——具有多行多列的一个区域的控件块,如下图所示. 明细表—— ...
- PyQt4 QListWidget 使用教程
转自:http://blog.csdn.net/seeground/article/details/49177387?locationNum=3&fps=1 listWidget = QLis ...
- 「ZJOI 2010」 排列计数
题目链接 戳我 \(Solution\) 其实我们可以发现这题等价于让你求: 用\(1\)~\(n\)的数组成一个完全二叉树使之满足小根堆性质的方案数 于是我们可以考虑\(dp\) 假设我们现在在\( ...
- C博客作业06—结构体&指针
1.本章学习总结 1.1思维导图 1.2本章学习体会 明白了结构体的定义及使用方法 学会了fopen,fclose,feof等文件操作函数,学会使用c语言进行文件操作 大作业中的部分函数出现未知错误且 ...