<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[Curl请求内存问题定位之VS2005中SetUnhandledExceptionFilter函数应用]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 08 Jan 2016 08:33:17 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	Unhandled exceptions 无法捕获的原因以及解决方案：<br/>http://name5566.com/934.html<br/><br/>回忆未来-向东-Jàck(372647693)&nbsp;&nbsp;16:09:29<br/>是超时了。<br/>我这网不好引起的：<br/>//CURLcode res;&nbsp;&nbsp;<br/>//res = curl_easy_perform(curl);<br/>curl_easy_perform(curl);<br/>//printf(&quot;upload file return res=%s&#92;n&quot;,res); <br/><br/>这样写就好了，这个res不要，就不会有问题，兄弟们分析是怎么回事导致的？<br/>胡说九道0531(18678088)&nbsp;&nbsp;16:10:41<br/>可以设置超时时长<br/>回忆未来-向东-Jàck(372647693)&nbsp;&nbsp;16:11:53<br/>curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeOut);&nbsp;&nbsp;有的 120.<br/>我是想让兄弟帮我分析为何我去了res就不崩溃了。<br/>simplesslife&lt;zhenglipeng_59@163.com&gt;&nbsp;&nbsp;16:12:45<br/>打印太费时间了？<br/>去掉printf试试<br/>胡说九道0531(18678088)&nbsp;&nbsp;16:13:39<br/>我也加了code=<br/>运行非常稳定<br/>回忆未来-向东-Jàck(372647693)&nbsp;&nbsp;16:14:03<br/>嗯，我呆会去掉打印看下，我快传完了。<br/><br/>curl的回调是啥个意思，这块兄弟们用它干嘛使的？<br/>simplesslife&lt;zhenglipeng_59@163.com&gt;&nbsp;&nbsp;16:14:57<br/>http返回的数据<br/>用来处理http返回的数据<br/>胡说九道0531(18678088)&nbsp;&nbsp;16:16:04<br/>就是接收resp<br/>胡说九道0531(18678088)&nbsp;&nbsp;16:17:50<br/>对于vc的异常的coredump<br/>你搜一下vc setunhandledexceptionfilter<br/>这个关键字就找到了，很多的，我另外一台机器不方便上网，就2个函数<br/><br/><br/>————————————————————————————————————————————————————————<br/>很多软件通过设置自己的异常捕获函数，捕获未处理的异常，生成报告或者日志（例如生成mini-dump文件），达到Release版本下追踪Bug的目的。但是，到了VS2005（即VC8），Microsoft对CRT（C运行时库）的一些与安全相关的代码做了些改动，典型的，例如增加了对缓冲溢出的检查。新CRT版本在出现错误时强制把异常抛给默认的调试器（如果没有配置的话，默认是Dr.Watson），而不再通知应用程序设置的异常捕获函数，这种行为主要在以下三种情况出现。<br/><br/>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用abort函数，并且设置了_CALL_REPORTFAULT选项（这个选项在Release版本是默认设置的）。<br/><br/>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启用了运行时安全检查选项，并且在软件运行时检查出安全性错误，例如出现缓存溢出。（安全检查选项 /GS 默认也是打开的）<br/><br/>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遇到_invalid_parameter错误，而应用程序又没有主动调用<br/><br/>_set_invalid_parameter_handler设置错误捕获函数。<br/><br/>所以结论是，使用VS2005（VC8）编译的程序，许多错误都不能在SetUnhandledExceptionFilter捕获到。这是CRT相对于前面版本的一个比较大的改变，但是很遗憾，Microsoft却没有在相应的文档明确指出。<br/><br/>解决方法<br/><br/>之所以应用程序捕获不到那些异常，原因是因为新版本的CRT实现在异常处理中强制删除所有应用程序先前设置的捕获函数，如下所示：<br/><br/>/* Make sure any filter already in place is deleted. */<br/><br/>SetUnhandledExceptionFilter(NULL);<br/><br/>UnhandledExceptionFilter(&amp;ExceptionPointers);<br/><br/>解决方法是拦截CRT调用SetUnhandledExceptionFilter函数，使之无效。在X86平台下，可以使用以下代码。<br/><br/>#ifndef _M_IX86<br/><br/>#error “The following code only works for x86!”<br/><br/>#endif<br/><br/> <br/><br/>void DisableSetUnhandledExceptionFilter()<br/><br/>&#123;<br/><br/>void *addr = (void*)GetProcAddress(LoadLibrary(_T(“kernel32.dll”)),<br/><br/>“SetUnhandledExceptionFilter”);<br/><br/>if (addr)<br/><br/>&#123;<br/><br/>unsigned char code[16];<br/><br/>int size = 0;<br/><br/>code[size++] = 0×33;<br/><br/>code[size++] = 0xC0;<br/><br/>code[size++] = 0xC2;<br/><br/>code[size++] = 0×04;<br/><br/>code[size++] = 0×00;<br/><br/> <br/><br/>DWORD dwOldFlag, dwTempFlag;<br/><br/>VirtualProtect(addr, size, PAGE_READWRITE, &amp;dwOldFlag);<br/><br/>WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);<br/><br/>VirtualProtect(addr, size, dwOldFlag, &amp;dwTempFlag);<br/><br/>&#125;<br/><br/>&#125;<br/><br/>在设置自己的异常处理函数后，调用DisableSetUnhandledExceptionFilter禁止CRT设置即可。<br/><br/>其它讨论<br/><br/>上面通过设置api hook，解决了在VS2005上的异常捕获问题，这种虽然不是那么“干净”的解决方案，确是目前唯一简单有效的方式。<br/><br/>虽然也可以通过_set_abort_behavior(0, _WRITE_ABORT_MSG &#124; _CALL_REPORTFAULT), signal(SIGABRT, …), 和_set_invalid_parameter_handler(…) 解决（1）（3），但是对于（2），设置api hook是唯一的方式。<br/><br/>来自：http://www.tiansin.com/thread-645.html
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] Curl请求内存问题定位之VS2005中SetUnhandledExceptionFilter函数应用]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>