﻿<?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++博客-Alex-文章分类-调试技巧</title><link>http://www.cppblog.com/alexhappy/category/10221.html</link><description>Faith First</description><language>zh-cn</language><lastBuildDate>Wed, 30 Dec 2009 20:00:58 GMT</lastBuildDate><pubDate>Wed, 30 Dec 2009 20:00:58 GMT</pubDate><ttl>60</ttl><item><title>自定义linux内核调试print</title><link>http://www.cppblog.com/alexhappy/articles/104450.html</link><dc:creator>alexhappy</dc:creator><author>alexhappy</author><pubDate>Wed, 30 Dec 2009 06:06:00 GMT</pubDate><guid>http://www.cppblog.com/alexhappy/articles/104450.html</guid><wfw:comment>http://www.cppblog.com/alexhappy/comments/104450.html</wfw:comment><comments>http://www.cppblog.com/alexhappy/articles/104450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/alexhappy/comments/commentRss/104450.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/alexhappy/services/trackbacks/104450.html</trackback:ping><description><![CDATA[<p>调试信息过多造成dmesg无法完全显示怎么办？ </p>
<p>&nbsp;</p>
<p>#ifndef __KERNEL__ <br>#define __KERNEL__ <br>#endif <br>#ifndef MODULE <br>#define MODULE <br>#endif </p>
<p>#if defined(MODVERSIONS) &amp;&amp; !defined(__GENKSYMS__) <br>#include <br>#endif </p>
<p>#ifdef DBGPRT_OUTVER <br>#include "dbgprint.ver" /* redefine "dbgprint" to include CRC */ <br>#endif </p>
<p>#ifndef EXPORT_SYMTAB <br>#define EXPORT_SYMTAB <br>#endif </p>
<p>#include <br>#include <br>#include <br>#include <br>#include <br>//#include <br>#include <br>#include </p>
<p>#include "dbgprint.h" </p>
<p>EXPORT_SYMBOL(DbgPrint); </p>
<p>#ifndef DBGPRT_VER <br>#define DBGPRT_VER "0.90" <br>#endif </p>
<p>int dbgprt_major=65; //the major device number <br>char dbgprt_dev_name[]={"ALIDbg"}; //the name in /dev <br>char dbgprt_ver[]={DBGPRT_VER}; <br>//module paramaters and infos <br>MODULE_AUTHOR("ALI_SHA"); <br>MODULE_DESCRIPTION("Ali M3321 DEBUGER PRINT."); </p>
<p>MODULE_PARM(dbgprt_ver,"s"); <br>MODULE_PARM_DESC(dbgprt_ver,DBGPRT_VER); </p>
<p>MODULE_PARM(dbgprt_major,"i"); <br>MODULE_PARM_DESC(dbgprt_major,"65"); </p>
<p>MODULE_PARM(dbgprt_dev_name,"s"); <br>MODULE_PARM_DESC(dbgprt_dev_name,"ALIDbg"); </p>
<p>&nbsp;</p>
<p>wait_queue_head_t pSleep; </p>
<p>//used to manager the buffer <br>char chrgMessage[4096]; //the last 1024 don't use for overflow <br>char* pchEnd; <br>char* pchStart; <br>char fTurn; //pchEnd littl than pchStart <br>char* pchMessageEnd; //the end pointer of array <br>int nOverLen; </p>
<p>&nbsp;</p>
<p>struct file_operations ALIDbgOps = <br>{ <br>THIS_MODULE, <br>NULL, <br>DbgRead, <br>NULL, //ali_write, <br>NULL, <br>NULL, <br>DbgIoCtl, <br>NULL, <br>DbgOpen, <br>NULL, <br>DbgClose, <br>NULL, <br>NULL, <br>NULL, <br>NULL, <br>NULL <br>}; </p>
<p>int init_module(void) <br>{ <br>int nResult; </p>
<p>nResult = register_chrdev(dbgprt_major,dbgprt_dev_name,&amp;ALIDbgOps); <br>if(nResult&lt;0) <br>{ <br>printk("can't register this device!\n"); <br>return -1; <br>} </p>
<p>pchStart=chrgMessage; <br>pchEnd=chrgMessage; <br>pchMessageEnd=chrgMessage+3072; <br>fTurn=0; </p>
<p>init_waitqueue_head(&amp;pSleep); <br>return 0; </p>
<p>} </p>
<p>int cleanup_module() <br>{ <br>unregister_chrdev(dbgprt_major,dbgprt_dev_name); <br>return 0; <br>} </p>
<p><br>int DbgOpen(struct inode* i,struct file *f) <br>{ <br>MOD_INC_USE_COUNT; <br>return 0; <br>} </p>
<p>int DbgClose(struct inode* i,struct file *f) <br>{ <br>wake_up_interruptible(&amp;pSleep); <br>MOD_DEC_USE_COUNT; <br>return 0; <br>} </p>
<p>ssize_t DbgRead (struct file* fileDbg, char* pchMsg, size_t nLen, loff_t* pOff) <br>{ <br>int nMsgLen; </p>
<p>if(!fTurn &amp;&amp; (pchStart==pchEnd) ) <br>{ <br>interruptible_sleep_on(&amp;pSleep); <br>} </p>
<p>if(!fTurn) <br>{ <br>nMsgLen=pchEnd-pchStart; <br>if(nLen { <br>copy_to_user(pchMsg,pchStart,nLen); <br>pchStart+=nLen; <br>return nLen; <br>} <br>copy_to_user(pchMsg,pchStart,nMsgLen); <br>} <br>else <br>{ <br>if(nLen { <br>copy_to_user(pchMsg,pchStart,nLen); <br>pchStart+=nLen; <br>return nLen; <br>} </p>
<p>copy_to_user(pchMsg,pchStart,nOverLen); <br>fTurn=0; </p>
<p>nMsgLen=pchEnd-chrgMessage; <br>if( (nLen-nOverLen) { <br>copy_to_user(pchMsg+nOverLen,chrgMessage,nLen-nOverLen); <br>pchStart=chrgMessage+nLen-nOverLen; <br>return nLen; <br>} <br>copy_to_user(pchMsg+nOverLen,chrgMessage,nMsgLen); <br>nMsgLen+=nOverLen; <br>} </p>
<p>pchStart=chrgMessage; <br>pchEnd=chrgMessage; </p>
<p>return nMsgLen; <br>} </p>
<p>int DbgIoCtl(struct inode* i,struct file *f,unsigned int cmd,unsigned long arg) <br>{ <br>switch(cmd) <br>{ <br>case DBGPRT_IO_CANCLE: <br>wake_up_interruptible(&amp;pSleep); <br>break; </p>
<p>default: <br>return -1; <br>} </p>
<p>return 0; <br>} </p>
<p>int DbgPrint(const char *fmt, ...) <br>{ <br>va_list args; <br>int nMessageLen; </p>
<p>va_start(args, fmt); <br>nMessageLen=vsprintf(pchEnd,fmt,args); <br>va_end(args); </p>
<p>pchEnd+=nMessageLen; </p>
<p>if(pchEnd&gt;=pchMessageEnd) <br>//the message overflowed <br>{ <br>nOverLen=pchEnd-pchMessageEnd; <br>pchEnd=chrgMessage; <br>fTurn=1; <br>} <br>else <br>{ <br>//the end pointer exceed the start pointor from back <br>if(fTurn &amp;&amp; (pchEnd&gt;pchStart)) <br>{ <br>pchStart=pchEnd; <br>*pchStart=255; //add a alarmer <br>} <br>} </p>
<p>wake_up_interruptible(&amp;pSleep); </p>
<p>return nMessageLen; <br>} </p>
<p>我所说的版本问题已经解决了. <br>可以用ioctl来cancle掉被挂起的read. </p>
<p><br><br>#ifndef _DBGPRT_H_ <br>#define _DBGPRT_H_ </p>
<p>#define DBGPRT_IO_CANCLE 1 </p>
<p>int DbgOpen(struct inode* i,struct file *f); <br>int DbgClose(struct inode* i,struct file *f); <br>ssize_t DbgRead (struct file* fileDbg, char* pchMsg, size_t nLen, loff_t* pOff); <br>int DbgIoCtl(struct inode* i,struct file *f,unsigned int cmd,unsigned long arg); <br>int DbgPrint(const char *fmt, ...); </p>
<p>#endif//_DBGPRT_H_</p>
<img src ="http://www.cppblog.com/alexhappy/aggbug/104450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/alexhappy/" target="_blank">alexhappy</a> 2009-12-30 14:06 <a href="http://www.cppblog.com/alexhappy/articles/104450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义的一个Windows出错消息宏</title><link>http://www.cppblog.com/alexhappy/articles/79798.html</link><dc:creator>alexhappy</dc:creator><author>alexhappy</author><pubDate>Thu, 30 Apr 2009 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/alexhappy/articles/79798.html</guid><wfw:comment>http://www.cppblog.com/alexhappy/comments/79798.html</wfw:comment><comments>http://www.cppblog.com/alexhappy/articles/79798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/alexhappy/comments/commentRss/79798.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/alexhappy/services/trackbacks/79798.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>#pragma comment( lib, "USER32" )</p>
<p>#include &lt;crtdbg.h&gt;<br>#define MTASSERT(a) _ASSERTE(a)</p>
<p><br>#define MTVERIFY(a) /*if (!(a))*/ PrintError(#a,__FILE__,__LINE__,GetLastError())</p>
<p>#define ERR_MESSAGE() PrintError("",__FILE__,__LINE__,GetLastError())</p>
<p>__inline void PrintError(LPSTR linedesc, LPSTR filename, int lineno, DWORD errnum)<br>{<br>&nbsp;&nbsp;&nbsp; LPSTR lpBuffer;<br>&nbsp;&nbsp;&nbsp; char errbuf[256] = {0};</p>
<p>#ifdef _WINDOWS<br>&nbsp;&nbsp;&nbsp; char modulename[MAX_PATH];<br>#else // _WINDOWS</p>
<p>&nbsp;&nbsp;&nbsp; DWORD numread;<br>#endif // _WINDOWS</p>
<p>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,errnum,LANG_NEUTRAL,(LPTSTR)&amp;lpBuffer,0,NULL);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //wsprintf(errbuf, "\nThe following call failed at line %d in %s:\n\n"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //" %s\n\nReason: %s\n", lineno, filename, linedesc, lpBuffer);<br>&nbsp;wsprintf(errbuf,"&#180;&#237;&#206;&#243;:%s",lpBuffer);</p>
<p>#ifdef _WINDOWS<br>&nbsp;&nbsp;&nbsp; GetModuleFileName(NULL, modulename, MAX_PATH);<br>&nbsp;&nbsp;&nbsp; MessageBox(NULL, errbuf, modulename, MB_ICONWARNING|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);<br>#else<br>&nbsp;&nbsp;&nbsp; WriteFile(GetStdHandle(STD_ERROR_HANDLE), errbuf, strlen(errbuf), &amp;numread, FALSE );<br>&nbsp;&nbsp;&nbsp; Sleep(3000);&nbsp;&nbsp;&nbsp; <br>#endif</p>
<p>&nbsp;&nbsp;&nbsp; exit(EXIT_FAILURE);<br>}</p>
<p>#include&lt;fstream&gt;</p>
<p>using namespace std;</p>
<p>#define SYS_LOG(var) PrintLog(__FILE__,__LINE__,var)</p>
<p>template &lt;class T&gt;<br>__inline void PrintLog(T var){<br>&nbsp;ofstream out("log.txt",ios::app);<br>&nbsp;if(!out)<br>&nbsp;&nbsp;return;<br>&nbsp;out&lt;&lt;var&lt;&lt;endl;<br>&nbsp;out.close();<br>&nbsp;return;<br>}</p>
<p>template &lt;class T&gt;<br>__inline void PrintLog(char *filename,int linenum,T var){<br>&nbsp;ofstream out("log.txt",ios::app);<br>&nbsp;if(!out)<br>&nbsp;&nbsp;return;<br>&nbsp;out&lt;&lt;filename&lt;&lt;endl&lt;&lt;linenum&lt;&lt;" : "&lt;&lt;var&lt;&lt;endl&lt;&lt;endl;<br>&nbsp;out.close();<br>&nbsp;return;<br>}</p>
<img src ="http://www.cppblog.com/alexhappy/aggbug/79798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/alexhappy/" target="_blank">alexhappy</a> 2009-04-30 17:34 <a href="http://www.cppblog.com/alexhappy/articles/79798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>