调试心得和工具
介绍调试的心得、原理、工具
lonelyrains
这个作者很懒,什么都没留下…
展开
-
如何实现一个引用计数?
要保证线程安全、要保证高效。这是一个跟芯片架构、编译器都相关的工作。剖析boost::detail::shared_ptr的计数实现机制:// shared_ptr中的引用计数成员属性pnboost::detail::shared_count pn; // reference counter// shared_count中的pi成员属性sp_counted_base * pi_;//原创 2016-04-12 16:29:06 · 4746 阅读 · 0 评论 -
程序运行时随机崩溃的几点调试方法
程序运行时随机崩溃的几点调试方法运行时随机崩溃,只可能是内存管理的问题。因为如果没有内存问题,程序不会崩溃,最多只是结果不对而已。写一段内存越界,直接崩溃写一段内存越界,不崩溃,而是破坏其他内存数据,访问其他内存数据时,崩溃空指针异常,直接崩溃重复释放内存,直接崩溃人工静态代码分析确认是否与多线程有关,如果是多线程有关,则想办法增加多线程竞争状态时间和调用频次,提高短时复现概率 参考原创 2016-04-06 21:36:23 · 4152 阅读 · 0 评论 -
c++ boost future和lazy future
程序流中常见的情况是,中间一段代码需要长时间运行,然后蛋疼的是后面一段代码需要这段中间代码的计算结果。比如这段代码是UI,或者这段代码是图像识别或者图形渲染等计算密集型的代码。以前笨拙的处理方式是,新开启一个线程去调用这段长时间运行的代码,并在线程内设置状态变量标记,表示计算完成与否。然后在之前的线程里判断状态标记以决定是否循环等待或者继续往下走码。这里面还牵扯到的概念是同步和异步。参见几年之前原创 2016-04-01 14:58:32 · 3640 阅读 · 0 评论 -
boost中的实用工具assign和uuid
assignassign重载‘+’=和‘,’实现连续赋值assign不仅支持全部8个STL标准容器(vector、string、deque、list、set、multiset、map、multimap),也对stl中的容器适配器提供了适当的支持,包括queue和priority_queue示例代码:int testAssign(){ using namespace boost::a原创 2016-03-24 22:04:44 · 3056 阅读 · 1 评论 -
boost的内存管理
smart_ptrraii ( Resource Acquisition Is Initialization )智能指针系列的都统称为smart_ptr,包括c++98标准的auto_ptr智能指针是一个类,通过重载->和*完成类似原始指针的操作。不过因为是类,所以可以做比如内存管理、线程安全之类的工作智能指针均是自动管理内存,不需要显示调用deletescoped_ptr原创 2016-03-24 15:46:35 · 1780 阅读 · 0 评论 -
Sqlite 技术内幕(译注版)(二)数据库文件格式
1. 数据库文件格式在深入到SQLite引擎的细节之前,我首先在以下两小节分别说明一下数据库命名惯例和数据库文件结构。2.1数据库命名惯例当应用试图通过sqlite3_open API函数打开一个数据库时,都需要传递给该函数数据库文件的名字。文件名可以是参考当前工作目录的相对路径,或者从系统文件树的根结点开始的绝对路径名。所有可以被地文件系统接受的常规文件名都不错。但是,有两个需翻译 2016-03-09 18:45:11 · 2171 阅读 · 0 评论 -
Sqlite 技术内幕(译注版)(一) 目录和概述
目录目录...21. 概述... 31.1 应用示例...51.1.1sqlite3_open.71.1.2sqlite3_prepare.71.1.3sqlite3_step.81.1.4sqlite3_column_int.81.1.5sqlite3_finalize.81.1.6sqlite3_close.8翻译 2016-03-09 18:43:22 · 1898 阅读 · 0 评论 -
<顶>给函数增加调试打印头(五)(申请加精)
VC++ 高级调试 自动化 跨平台原创 2014-05-07 22:11:27 · 2202 阅读 · 0 评论 -
给函数增加Debug头(四)
延续上一篇给函数增加Debug头(扩展二)需要增加的新特性1、debug_astyle.h的包含暂时不增加路径层数识别,直接使用系统目录或者配置项目的附加目录,方便达到效果,使用#include 声明。这样的坏处是对于不同的项目使用的debug_astyle.h只能是相同的,不过问题不大(MFC和非MFC程序同时调用,关于#include的问题5就暴露出来了)。2、能识别头尾宏是否原创 2013-08-13 17:42:21 · 1303 阅读 · 0 评论 -
给函数增加Debug头(三)
对某6万多行代码的项目实战应用时,作出以下调整:1、为满足非C99标准,不允许在中间定义变量,使用DEBUG_START、DEBUG_END使用大括号的方式包含函数2、修改add.bat,边调试AStyleDbg边调用输出添加头3、修改astyle工程的输出文件名4、不使用log_Log写到文件,使用OutputDebugStringA速度确实快很多(OutputDebug原创 2013-07-23 21:00:19 · 1415 阅读 · 0 评论 -
给函数增加Debug头(二)
关于给函数增加Debug头,博客内已有一篇文章对此进行阐述:给函数增加Debug头。此篇为更具有实用工程价值的基于Astyle的开发版本,附有源码工程原创 2013-07-19 01:27:01 · 1788 阅读 · 0 评论 -
给函数增加Debug头 - windows平台的普通打印调试处理
笔者在VS2008和VC6.0两种常用平台应用此工具,发现VC6.0版本不支持__FUNCTION__宏,有高手自定义的__FUNCTION__实现在此。 有几个问题需要注意:1、在MFC环境下报错的问题:①#error WINDOWS.H already included. MFC apps must not #include 。无奈的解决方法是把自动添加上的调试头文件#i原创 2013-07-23 21:14:27 · 1910 阅读 · 0 评论 -
给函数增加debug头(一)
调试程序时,经常需要查看程序的函数调用的流动方向。在PC上很简单,可以F10、F11单步调试查看或者gdb命令行查看。不过实际调试发现,在处理多重继承和虚函数的调用时,vc-express-2008的调试器单步并不能很好的发挥效用【目前还未单独针对这个结论做样例,以后再补上】。而在嵌入式设备上却很难实现单步调试。打印日志就成了很有用的调试方式。然而,在比较庞大的程序里,所有的函数头手动添加调试语句原创 2012-07-05 18:38:25 · 2768 阅读 · 0 评论