﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-曲径通幽</title><link>http://www.cppblog.com/chinloon/</link><description>programming_with_fun();</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 09:39:58 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 09:39:58 GMT</pubDate><ttl>60</ttl><item><title>Windows下编译 libevent 64位静态库</title><link>http://www.cppblog.com/chinloon/archive/2012/06/26/180322.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Tue, 26 Jun 2012 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/06/26/180322.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/180322.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/06/26/180322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/180322.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/180322.html</trackback:ping><description><![CDATA[按照libevent的文档，使用VC的nmake -f Makefile.nmake即可编译32位release模式。<br />因为项目中要求编译64位的版本，需要在Makefile.nmake中添加一个LIBFLAGS选项 /MACHINE:X64<br />如果要加调试信息，可以在 CFLAGS中加入/Zi，32位加调试选项是 CFLAGS中加/ZI，当然要调整优化选项/Ox<img src ="http://www.cppblog.com/chinloon/aggbug/180322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-06-26 14:54 <a href="http://www.cppblog.com/chinloon/archive/2012/06/26/180322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再遇 SQLITE_BUSY</title><link>http://www.cppblog.com/chinloon/archive/2012/06/06/177803.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Wed, 06 Jun 2012 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/06/06/177803.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/177803.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/06/06/177803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/177803.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/177803.html</trackback:ping><description><![CDATA[记得以前解决过这个问题，现在帮助同事查BUG的时候，再次遇到，记录一下省的下次再苦苦回忆。<br />遇到这个问题，一般而言是3种情况造成：<br />1) 其他线程、进程正在执行一次写操作<br />&nbsp; &nbsp; 根据SQLITE文档，所有写操作(当然SELECT不算写操作)，SQLITE内部都会自动添加事务，这样在线程同时写有依赖关系的表的时候，自然会发生冲突<br />2) 当前SQLITE被&#8220;BEGIN TRANSACTION&#8221; lock住了，这个问题其实包含了1)中的隐形调用，另外别忘了自己的代码一定要在执行完BEGIN 后 COMMIT<br />3) 有statement对象未finalize，且未reset(出错时)<br />&nbsp; &nbsp; 这个情况占多数，我项目中遇到两次都是这个情况，<br /><div style="text-align: justify;">&nbsp; &nbsp; 当然，要注意即使自己未直接调用 prepare-step-finalize，在某些API执行的时候会隐式调用(比如sqlite3_exec)，当然这种情况一般会归在1)里</div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div style="text-align: justify;">&nbsp;&nbsp;&nbsp;</div></blockquote><img src ="http://www.cppblog.com/chinloon/aggbug/177803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-06-06 16:35 <a href="http://www.cppblog.com/chinloon/archive/2012/06/06/177803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c/c++ 可变参数在函数中的传递</title><link>http://www.cppblog.com/chinloon/archive/2012/06/05/177672.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Tue, 05 Jun 2012 09:53:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/06/05/177672.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/177672.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/06/05/177672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/177672.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/177672.html</trackback:ping><description><![CDATA[@note: 只在windows中测试，未在linux上跑过<br />
方法一： 通过宏传递<br />
例如<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;myprintf(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;format,&nbsp;);<br />
2&nbsp;<br />
3&nbsp;#ifndef&nbsp;PASS_ARGS<br />
4&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;PASS_ARGS(_fmt,)&nbsp;\<br />
5&nbsp;&nbsp;&nbsp;myprintf(fmt,__VA_ARGS__)<br />
6&nbsp;<span style="color: #0000FF; ">#endif</span></div>
<br />
这种方式最简单最直接，但不利于函数的封装调用。<br />
<br />
方法二： 通过函数传递<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp;2&nbsp;<br />
&nbsp;3&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;myprintf(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;fmt,&nbsp;)<br />
&nbsp;4&nbsp;{<br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;args;<br />
&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_start(args,&nbsp;fmt);<br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myprintf_internal(fmt,&nbsp;args);<br />
&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_end(args);<br />
&nbsp;9&nbsp;}</div>
<span style="font-size: small; ">这种方法可以在函数内传递 va_list</span><br />
<span><font size="2"><br />
至于 myprintf(const char*, ...) 传给 myprintf_internal(const char*, ...)这种方式，貌似只能通过循环解析出实参个数和内容，再传递给下一个函数，感觉上这样做可能会存在性能损耗</font></span><img src ="http://www.cppblog.com/chinloon/aggbug/177672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-06-05 17:53 <a href="http://www.cppblog.com/chinloon/archive/2012/06/05/177672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux ssh 任务的断开与重连</title><link>http://www.cppblog.com/chinloon/archive/2012/04/27/172868.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Thu, 26 Apr 2012 16:17:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/04/27/172868.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/172868.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/04/27/172868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/172868.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/172868.html</trackback:ping><description><![CDATA[直接用自带的 screen 即可解决，screen 中执行的任务 c-a d 之后会把任务切后台，<br />重新SSH上去之后，screen -ls 找到ID，直接 screen -r [id]<br /><br /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a ? 显示所有键绑定信息</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a w 显示所有窗口列表</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a C-a 切换到之前显示的窗口</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a c 创建一个新的运行shell的窗口并切换到该窗口</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a n 切换到下一个窗口</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a p 切换到前一个窗口(与C-a n相对)</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a 0..9 切换到窗口0..9</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a a 发送 C-a到当前窗口</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a d 暂时断开screen会话</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a k 杀掉当前窗口</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; " /><span style="color: #383838; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 24px; text-align: left; ">C-a [ 进入拷贝/回滚模式</span><img src ="http://www.cppblog.com/chinloon/aggbug/172868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-04-27 00:17 <a href="http://www.cppblog.com/chinloon/archive/2012/04/27/172868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windbg open &amp; read dump file</title><link>http://www.cppblog.com/chinloon/archive/2012/03/30/169514.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Fri, 30 Mar 2012 06:30:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/03/30/169514.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/169514.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/03/30/169514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/169514.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/169514.html</trackback:ping><description><![CDATA[在工作中遇到windbg需要打开mini dump文件，MARK一下。<br /><span style="background-color: #eeeeee; font-size: 13px; ">!</span><span style="style=&quot;color:"  #000000;="" background-color:=""  #eeeeee;="" font-size:=""  13px;="" "="">analyze&nbsp;</span><span style="color: #000000;background-color: #eeeeee; font-size: 13px; ">-</span><span style="color: #000000;" background-color:=""  #eeeeee;="" font-size:=""  13px;="" "="">v</span>&nbsp;<img src ="http://www.cppblog.com/chinloon/aggbug/169514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-03-30 14:30 <a href="http://www.cppblog.com/chinloon/archive/2012/03/30/169514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 SQLite 优化</title><link>http://www.cppblog.com/chinloon/archive/2012/01/19/164380.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Thu, 19 Jan 2012 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/01/19/164380.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/164380.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/01/19/164380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/164380.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/164380.html</trackback:ping><description><![CDATA[项目里遇到一个问题，在我们程序客户端运行时，sqlite数据库会不断自动生成/删除 journal 文件，高峰时候会占用大量的IO，导致程序很慢。<br />由于客户端本身的数据完整性不重要，性能非常重要，所以想禁止这个文件的生成。<br />后来查了一下文档，并实践过后，发现网络上所有的关于关闭/打开某些宏来防止生成的方法都不管用。情急之下，只有改源码了。<br />改的地方是在main.c 的&nbsp;sqlite3BtreeFactory 里，直接加个宏就好了&nbsp;omitJournal<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; "><strong>&nbsp;</strong>1</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">sqlite3BtreeFactory(</span><br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">const</span>&nbsp;<span style="color: #000000; ">sqlite3&nbsp;*db,</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Main&nbsp;database&nbsp;when&nbsp;opening&nbsp;aux&nbsp;otherwise&nbsp;0&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">const</span>&nbsp;<span style="color: #0000ff; ">char</span>&nbsp;<span style="color: #000000; ">*zFilename</span>,&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Name&nbsp;of&nbsp;the&nbsp;file&nbsp;containing&nbsp;the&nbsp;BTree&nbsp;database&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">omitJournal</span><span style="color: #000000; ">,&nbsp;&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;if&nbsp;TRUE&nbsp;then&nbsp;do&nbsp;not&nbsp;journal&nbsp;this&nbsp;file&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">nCache,</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;How&nbsp;many&nbsp;pages&nbsp;in&nbsp;the&nbsp;page&nbsp;cache&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">vfsFlags,</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Flags&nbsp;passed&nbsp;through&nbsp;to&nbsp;vfsOpen&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;<span style="color: #000000; ">Btree&nbsp;**ppBtree&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Pointer&nbsp;to&nbsp;new&nbsp;Btree&nbsp;object&nbsp;written&nbsp;here&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">){</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">btFlags&nbsp;=&nbsp;0;</span><br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">rc;</span><br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;<span style="color: #000000; ">assert(&nbsp;sqlite3_mutex_held(db-&gt;mutex)&nbsp;);</span><br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;<span style="color: #000000; ">assert(&nbsp;ppBtree&nbsp;!=&nbsp;0);</span><br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000ff; ">#ifdef&nbsp;OMIT_JOURNAL</span><br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;<span style="color: #000000; ">omitJournal&nbsp;=&nbsp;1;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!&lt;&nbsp;turn&nbsp;off&nbsp;journal&nbsp;file</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000ff; ">#endif</span></div><hr /><img src ="http://www.cppblog.com/chinloon/aggbug/164380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-01-19 17:58 <a href="http://www.cppblog.com/chinloon/archive/2012/01/19/164380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost::python 遇到的一些问题总结</title><link>http://www.cppblog.com/chinloon/archive/2011/09/20/156313.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Tue, 20 Sep 2011 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2011/09/20/156313.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/156313.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2011/09/20/156313.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/156313.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/156313.html</trackback:ping><description><![CDATA[环境:<br />&nbsp;&nbsp; WinXP-SP3(chs) + VS2010-SP1(en-us) + boost 1.47.0 + python 2.7(ActivePython2.7 携带)<br /><br />&nbsp;&nbsp; boost编译时，boost::python库编译为 stage debug release link=static runtime-link=shared<br /><br />问题1:<br />&nbsp;&nbsp; python27 不认dll作为extension<br />解决方案：<br />&nbsp;&nbsp; project的output file 和 extension 都设置为 .pyd<br /><br />问题2：<br />&nbsp;&nbsp; 需要在导出类函数时，支持带指针的参数 （重头戏）<br />解决方案：<br />&nbsp;&nbsp; 这个问题似乎网上没有一个完整的答案，零零碎碎的问题有一堆，但感觉都不到位，接下来我就给个方案吧。(我对boost::python也不熟，如有错误希望好言指正:) )<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">boost</span><span style="color: #000000; ">/</span><span style="color: #000000; ">python.hpp</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;boost::python;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;World<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;simpleHello(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">this&nbsp;is&nbsp;simple&nbsp;hello\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hello(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">data)<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">World&nbsp;say&nbsp;hello&nbsp;:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">data);<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;ready(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1234</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">BOOST_PYTHON_MODULE(sample)<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;class_</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">World</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">World</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">simpleHello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">World::simpleHello)<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">World::hello,&nbsp;arg(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">data</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ready</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">World::ready,&nbsp;return_value_policy</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">return_opaque_pointer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">())<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;;<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">}</span></div><br />这里要说明二点：<br />1）这个例子既有传指针参数，又有返回指针对象，算是把boost::python两个典型问题囊括了。<br />2）return_opaque_pointer 是我查官方文档后得到的一个变通（官方推荐这里用 manage_new_object，但不管你编不编的过，反正我是编不过，在翻了Reference manual后看到了 opaque_pointer，看名字觉得有戏，就拿来用了。貌似opaque_pointer的严格性更低一点。编译通过，运行OK，反正就这样了）<span style="color: #000000; "></span><img src ="http://www.cppblog.com/chinloon/aggbug/156313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2011-09-20 14:29 <a href="http://www.cppblog.com/chinloon/archive/2011/09/20/156313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>研究了一天ZeroMQ，有个严重的问题还没解决</title><link>http://www.cppblog.com/chinloon/archive/2011/06/14/148641.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Tue, 14 Jun 2011 08:59:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2011/06/14/148641.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/148641.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2011/06/14/148641.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/148641.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/148641.html</trackback:ping><description><![CDATA[&nbsp; ZeroMQ是一个Message Queue的实现方案，支持超多种语言的Binding，今天研究了一下，起初对它的N:N模型很感兴趣，后来试用了其自带的 Load Balance特性，结果发现一个非常严重的问题，在Server Cluster中，如果有一台服务器在接收消息后Blocking，或者服务器崩溃了，没来得及send response，则客户端的请求一直就停留在这次send req上，永远无法检测出error，我查了关于timeout的文档，后来改用poll模型试了很久，还是没法解决。接下来可能要花时间仔细研读一下Guide了。<img src ="http://www.cppblog.com/chinloon/aggbug/148641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2011-06-14 16:59 <a href="http://www.cppblog.com/chinloon/archive/2011/06/14/148641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下调试死循环</title><link>http://www.cppblog.com/chinloon/archive/2011/06/13/148580.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Mon, 13 Jun 2011 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2011/06/13/148580.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/148580.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2011/06/13/148580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/148580.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/148580.html</trackback:ping><description><![CDATA[&nbsp; 最近在工作中发现网络通信收发文件部分，发送一次文件后，就再也不能发第二次了。本以为是协议的问题，后来用TOP发现CPU过高，才通过GDB看到了是一个清空Buffer类的代码有BUG，计算无符号整形的操作溢出了。<br />&nbsp; 具体跟踪方法记录一下。首先正常启动程序，然后进行收发文件操作，触发死循环。而后通过 top -H 查看哪个线程(其实是PID，redhat的线程是fork进程实现的)占用CPU过高，而后gdb -p [pid] attach 之，最后bt 打印堆栈。<img src ="http://www.cppblog.com/chinloon/aggbug/148580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2011-06-13 13:49 <a href="http://www.cppblog.com/chinloon/archive/2011/06/13/148580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一段 汇编代码</title><link>http://www.cppblog.com/chinloon/archive/2011/01/06/138068.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Thu, 06 Jan 2011 04:48:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2011/01/06/138068.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/138068.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2011/01/06/138068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/138068.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/138068.html</trackback:ping><description><![CDATA[这是从别人博客上摘的一段C嵌汇编码 <br>(&nbsp;http://www.cppblog.com/kevinlynx/archive/2011/01/02/137886.html
)<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; color: #220000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">__declspec(naked)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">void&nbsp;caller(void*&nbsp;pfn,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">)&nbsp;<br><img id="Codehighlighter1_45_172_Open_Image" onclick="this.style.display='none'; codehighlighter1_45_172_open_text.style.display=" none="" ;="" codehighlighter1_45_172_closed_image.style.display="'inline';" codehighlighter1_45_172_closed_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_45_172_Closed_Image" onclick="this.style.display='none'; codehighlighter1_45_172_closed_text.style.display=" none="" ;="" codehighlighter1_45_172_open_image.style.display="'inline';" codehighlighter1_45_172_open_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;__asm&nbsp;<br><img id="Codehighlighter1_62_170_Open_Image" onclick="this.style.display='none'; codehighlighter1_62_170_open_text.style.display=" none="" ;="" codehighlighter1_62_170_closed_image.style.display="'inline';" codehighlighter1_62_170_closed_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_62_170_Closed_Image" onclick="this.style.display='none'; codehighlighter1_62_170_closed_text.style.display=" none="" ;="" codehighlighter1_62_170_open_image.style.display="'inline';" codehighlighter1_62_170_open_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;eax;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;eax,&nbsp;3;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xchg&nbsp;dword&nbsp;ptr[esp],&nbsp;eax;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;eax;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</div>
下面是调用方法<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><img style="color: #220000;" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #220000;">void&nbsp;print_str(&nbsp;const&nbsp;char&nbsp;*s&nbsp;)</span><br style="color: #220000;"><img style="color: #220000;" id="Codehighlighter1_32_60_Open_Image" onclick="this.style.display='none'; codehighlighter1_32_60_open_text.style.display=" none="" ;="" codehighlighter1_32_60_closed_image.style.display="'inline';" codehighlighter1_32_60_closed_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_32_60_Closed_Image" onclick="this.style.display='none'; codehighlighter1_32_60_closed_text.style.display=" none="" ;="" codehighlighter1_32_60_open_image.style.display="'inline';" codehighlighter1_32_60_open_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img style="color: #220000;" src="http://www.cppblog.com/Images/dot.gif"><span style="color: #220000;">{</span><br style="color: #220000;"><img style="color: #220000;" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><span style="color: #220000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"%s\n",&nbsp;s&nbsp;);</span><br style="color: #220000;"><img style="color: #220000;" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"><span style="color: #220000;">}</span><br style="color: #220000;"><br style="color: #220000;"><span style="color: #220000;">{</span><br style="color: #220000;"><span style="color: #220000;">&nbsp;&nbsp; ...</span><br style="color: #220000;"><img style="color: #220000;" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #220000;">caller(&nbsp;print_str,&nbsp;"a&nbsp;string"&nbsp;);</span><br style="color: #220000;"><span style="color: #220000;">&nbsp;&nbsp; __asm&nbsp; add&nbsp;esp,&nbsp;4</span><br style="color: #220000;"><span style="color: #220000;">&nbsp;&nbsp;
...</span><br style="color: #220000;"><span style="color: #220000;">}</span><br></div>
<br>&nbsp; 原作者讲了一些基础，这里就不提了<br>看了一遍，发现 "ADD EAX, 3" 的用法有点奇怪（我相信搞破解的人一定比较熟悉，但正常的程序不会这么写。）<br>初看 EAX 是地址，+3是很危险的，但仔细一看，发现代码是为了从最外层主调函数一路穿越"caller" 直达 print_str，这里牵涉到一个重要问题，就是在CALL指令时，会有将&#8220;CALL指令下一条地址压栈&#8221;的操作，那么代码思路很明了了，就是为了要造出 调用print_str时，ESP(+0) 指向 caller(..)调用的下一个地址。<br>&nbsp; 第一关已经顺利搞定，但又碰到个问题，由于 print_str 的入参是可变的，所以必须用 cdecl调用，那RET之后 如何平栈呢？ 如果直接跳到 caller下一条地址，就丧失了平栈的机会，最终会在某个主调函数上被微软的 stack cookie捕获抛个SEH。<br>&nbsp; 这里就用到文章开头提到的 ADD EAX, 3。<br>&nbsp; 必须要造一个环境，让 caller 调用完成后，给个机会清理现场。于是乎，caller之后就有了 ADD ESP, 4。其实这里的4是与print_str的入参数目相关的，每个参数要多加 4字节，如此一来，整个代码就理顺了。<br>&nbsp; 那为什么 是 ADD EAX, 3呢？ 应该是预估出一条ADD指令占用多少长度，和具体的环境有关。因为没看INTEL手册，这里只能认为ADD 寄存器+WORD的长度是3个字节。我用VC试验了一下，的确是如此，我也尝试了ADD 寄存器+DWORD，长度变为了5个字节。<br>   <img src ="http://www.cppblog.com/chinloon/aggbug/138068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2011-01-06 12:48 <a href="http://www.cppblog.com/chinloon/archive/2011/01/06/138068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>