精华内容
下载资源
问答
  • 文章目录1、关系数据库2、列式数据库3、键值数据库4、图形数据库5、分布式文档存储数据库 数据是一个企业的核心资产,几乎所有的企业应用系统都是围绕...数据积累中,虽然有些把数据作为文本文件来保存的,但大...

    数据是一个企业的核心资产,几乎所有的企业应用系统都是围绕数据来进行的,包括数据的增删改查,数据对企业,甚至国家来说,有着不可估量的价值,比如,一个企业的所有客户的信息,一个投资机构的投入和收益信息,BAT公司的应用系统的源代码,京东的物流配送信息等等。

    在数据积累中,虽然有些把数据作为文本文件来保存的,但大多数情况下,为了方便地管理和提取数据,一般都会采用数据库来积累数,随着技术的发展,业务需求的多样化,出现了各种各样的数据库类型。

    下面分别一一说明其代表的产品以及其主要特点。

    1、关系数据库

    关系型数据一直为我们所用,比如Oracle,MySQL,SQL Server,Postgress。

    保存到关系数据库的数据必须满足一定要求,用通用的话来说就是满足一定的数据范式,比如主键,外键,数据的冗余;

    举个例子,学生的信息可以保存到数据库中,班级的信息也可以保存到数据库中,而且一个班级包括很多学生,他们之间通过外键还可以建立一种1对多的对应关系,这些信息和关系可以通过关系型数据库进行存储,值得注意的是,关系型数据库,需要预先定义其表结构,而且存储前需要定义其对应的数据类型或者长度,一旦有新的属性加入,就要修改其表的结构。

    传统的关系型数据库其实就是行式数据库,就是一行一行的方式来存储信息的。

    2、列式数据库

    列式数据库一般应用于对应大量的字符串数据,实例如 HBase,cassandra,Sybase IQ,HP Vertica、EMC Greenplum等。

    列式数据库从一开始就是面向大数据环境下数据仓库的数据分析而产生,主要适合于批量数据处理和即时查询。

    下面这2张图形象的说明了什么是列式数据库,什么是行式数据库已经两者之间的区别。

    img

    img

    极高的装载速度 (最高可以等于所有硬盘IO 的总和,基本是极限了)

    适合大量的数据而不是小数据

    实时加载数据仅限于增加(删除和更新需要解压缩Block 然后计算然后重新压缩储存)

    高效的压缩率,不仅节省储存空间也节省计算内存和CPU,为什么具有高压缩率呢?因为存储的数据类型是一样的。

    非常适合做聚合操作。

    3、键值数据库

    即Key-Value存储,简称KV存储。它是NoSQL存储的一种方式。它的数据按照键值对的形式进行组织,索引和存储。KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘的次数,比SQL数据库存储拥有更好的读写性能。
    典型的产品有: 亚马逊的 DynamoDB,redis。

    img

    4、图形数据库

    图形数据库不是专门用来存储图形图像的,而是因为其用图状结构来维持其数据之间的关系,所以叫做图形数据库。Neo4j,Sones就是其典型代表。

    在图数据结构中,只有两种基本的数据类型 即节点(Node)和关系(Relationship),节点(Node)可以拥有属性,关系(Relationship)也可以拥有属性 ,属性都是以键值对的方式存储,节点(Node)与节点(Node)的联系通过关系(Relationship)进行建立,他们建立的关系是有方向的。

    img

    Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注。其支持几乎所有的主流的开发语言

    img

    5、分布式文档存储数据库

    不需要定义,应用灵活,文档存储支持对结构化数据的访问,不同于关系模型的是,文档存储没有强制的架构。与关系模型不同的是,文档存储模型支持嵌套结构。例如,文档存储模型支持XML和JSON文档,字段的“值”又可以嵌套存储其它文档。文档存储模型也支持数组和列值键。与键值存储不同的是,文档存储关心文档的内部结构。这使得存储引擎可以直接支持二级索引,从而允许对任意字段进行高效查询。支持文档嵌套存储的能力,使得查询语言具有搜索嵌套对象的能力,XQuery就是一个例子。

    MongoDB通过支持在查询中指定JSON字段路径实现类似的功能。比如,CouchDB,MongoDB等。

    转载: https://www.cnblogs.com/lzh-boy/p/10444695.html

    展开全文
  • java中都有哪些异常

    千次阅读 2018-01-24 10:09:38
    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现创建图片,调用数组这些操作中,比如...
    今天看到一篇文章,哇,那异常真的多,好多都没见过, 也是给自己找找逼格,以后装装逼。
    先转为敬
    1. java.lang.nullpointerexception
    这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)

    2. java.lang.classnotfoundexception
    这个异常是很多原本在jb等开发环境中开发的程序员,把jb下的程序包放在wtk下编译经常出现的问题,异常的解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可,如果是在jb下做的程序包,一般都是默认加上package的,所以转到wtk下后要注意把package的路径加上。

    3. java.lang.arithmeticexception
    这个异常的解释是"数学运算异常",比如程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。

    4. java.lang.arrayindexoutofboundsexception
    这个异常相信很多朋友也经常遇到过,异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。

    5. java.lang.illegalargumentexception
    这个异常的解释是"方法的参数错误",很多j2me的类库中的方法在一些情况下都会引发这样的错误,比如音量调节方法中的音量参数如果写成负数就会出现这个异常,再比如g.setcolor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。

    6. java.lang.illegalaccessexception
    这个异常的解释是"没有访问权限",当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了package的情况下要注意这个异常。

    其他还有很多异常,我就不一一列举了,我要说明的是,一个合格的程序员,需要对程序中常见的问题有相当的了解和相应的解决办法,否则仅仅停留在写程序而不会改程序的话,会极大影响到自己的开发的。关于异常的全部说明,在api里都可以查阅。

    算术异常类:ArithmeticExecption

    空指针异常类:NullPointerException

    类型强制转换异常:ClassCastException

    数组负下标异常:NegativeArrayException

    数组下标越界异常:ArrayIndexOutOfBoundsException

    违背安全原则异常:SecturityException

    文件已结束异常:EOFException

    文件未找到异常:FileNotFoundException

    字符串转换为数字异常:NumberFormatException

    操作数据库异常:SQLException

    输入输出异常:IOException

    方法未找到异常:NoSuchMethodException

    java.lang.AbstractMethodError

    抽象方法错误。当应用试图调用抽象方法时抛出。

    java.lang.AssertionError

    断言错。用来指示一个断言失败的情况。

    java.lang.ClassCircularityError

    类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。

    java.lang.ClassFormatError

    类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。

    java.lang.Error

    错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。

    java.lang.ExceptionInInitializerError

    初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。

    java.lang.IllegalAccessError

    违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。

    java.lang.IncompatibleClassChangeError

    不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。

    java.lang.InstantiationError

    实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.

    java.lang.InternalError

    内部错误。用于指示Java虚拟机发生了内部错误。

    java.lang.LinkageError

    链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。

    java.lang.NoClassDefFoundError

    未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。

    java.lang.NoSuchFieldError

    域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。

    java.lang.NoSuchMethodError

    方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。

    java.lang.OutOfMemoryError

    内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。

    java.lang.StackOverflowError

    堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。

    java.lang.ThreadDeath

    线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。

    java.lang.UnknownError

    未知错误。用于指示Java虚拟机发生了未知严重错误的情况。

    java.lang.UnsatisfiedLinkError

    未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。

    java.lang.UnsupportedClassVersionError

    不支持的类版本错误。当Java虚拟机试图从读取某个类文件,但是发现该文件的主、次版本号不被当前Java虚拟机支持的时候,抛出该错误。

    java.lang.VerifyError

    验证错误。当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。

    java.lang.VirtualMachineError

    虚拟机错误。用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况。

    java.lang.ArithmeticException

    算术条件异常。譬如:整数除零等。

    java.lang.ArrayIndexOutOfBoundsException

    数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。

    java.lang.ArrayStoreException

    数组存储异常。当向数组中存放非数组声明类型对象时抛出。

    java.lang.ClassCastException

    类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。

    java.lang.ClassNotFoundException

    找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。

    java.lang.CloneNotSupportedException

    不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。

    java.lang.EnumConstantNotPresentException

    枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,抛出该异常。

    java.lang.Exception

    根异常。用以描述应用程序希望捕获的情况。

    java.lang.IllegalAccessException

    违法的访问异常。当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法,而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。

    java.lang.IllegalMonitorStateException

    违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。

    java.lang.IllegalStateException

    违法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时,抛出该异常。

    java.lang.IllegalThreadStateException

    违法的线程状态异常。当县城尚未处于某个方法的合法调用状态,而调用了该方法时,抛出异常。

    java.lang.IndexOutOfBoundsException

    索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。

    java.lang.InstantiationException

    实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。

    java.lang.InterruptedException

    被中止异常。当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。
    展开全文
  • 平时搭建PHP网站,可以linux服务器上搭建,也可以windows服务器上搭建,主要看你个人需求了,今天我们演示的是用PHPWAMP绿色集成环境在windows服务器上搭建php网站。   这款PHPWAMP绿色集成环境也属于WAMP...

     

    文章来源于网络转载,原作者未知。

     

    服务器版本:Windows Server 2008 R2 Enterprise

    平时搭建PHP网站,可以在linux服务器上搭建,也可以在windows服务器上搭建,主要看你个人需求了,今天我们演示的是用PHPWAMP绿色集成环境在windows服务器上搭建php网站。

     

    这款PHPWAMP绿色集成环境也属于WAMP套件,大家知道什么是WAMP吧?

    Windows下的Apache+Mysql+PHP,称为WAMP。

     

    WAMP套件其实有很多,就比如wampserver、apmserv、xampp等等,这些WAMP环境各有特点。

    本文演示的是纯绿色的PHP集成环境PHPWAMP,这款集成环境是我在网上找到的。

    所采用的版本号是2016年的8.1.8.8版本,看官方网站介绍,2017年的8.8.8.8版本估计也差不多要出来了。

     

     

    为什么要使用PHPWAMP集成环境,而不是其他集成环境呢?

    1、因为PHPWAMP解压即可使用,你甚至不需要安装VC运行库也可直接运行,而其他的集成环境都需要你额外去安装vc运行库,下载费时间,安装也费时间。

    2、PHPWAMP默认集成的各个组件都是最新版本的,而且是完整版,所以更加适合在服务器上运行(其他集成环境通常用来测试的,集成的组件阉割过,体积小很多)当然PHPWAMP也很适合在本地测试,如果包括32位和64位、线程安全与非线程安全的PHP版本,共计700多个PHP版本随便你切换。

    3、PHPWAMP可以同时运行各个不同版本的PHP网站,十分适合对比测试。多版本同时运行也适合在服务器上运行那些对php版本要求比较严格的PHP程序,可在服务器上同时运行不同php版本的网站程序。

    4、关键这货还能一键去除域名后面的端口号,实现与Apache、Nginx、IIS等WEB服务器共存时,去掉域名后面的端口号。

    5、兼容性很强,兼容XP系统、windows7、windows8、windows10也能完美兼容,在各windows服务器上兼容能力也很强。

    6、phpwamp集成环境还能与其他任意环境共存,互不影响,端口号可视化修改,强制解除端口占用等。

    7、拥有强制干掉一切环境阻碍,一键强制卸载任意php环境,瞬间轰掉阻碍(不会影响系统),简单粗暴,让你节省时间立刻完成网站配置。

    8、切换PHP版本方便,还能自定义PHP版本,提供700个PHP版本随便你换,及时满足各种程序对不同版本的需求。

    9、在phpMyAdmin官方网站,你可以看到phpMyAdmin的各个版本下载中都提示了不同版本所能兼容的PHP版本与数据库版本,而PHPWAMP自带的数据库管理工具phpMyAdmin经过特殊修改,能完美兼容任何PHP版本,无论你切换任意PHP版本,都能正常使用,不会像一些PHP环境那样,升级或者换个版本,phpMyAdmin就会出现问题。

    10、PHPWAMP拥有自动定期重启动服务器,自动定期重启动apache、mysql等服务的功能。

     

     

     

    下面演示在服务器上搭建php网站的过程,服务器版本如下图显示Windows Server 2008 R2 Enterprise

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    在任意IDC服务商购买服务器后,在本地电脑点这里打开远程桌面连接,来连接远程服务器

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    然后在出来的界面输入你所购买服务器的相关信息,如下图

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    下图就是登陆后的样子,现在我们可以操作这台服务器了。

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    然后用服务器自带的浏览器下载PHPWAMP集成环境,可以在百度搜“PHPWAMP”,找到官网下载。

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    解压后打开软件

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    把主界面的端口改成80

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    切换任意php版本,然后打开Apache2.4站点管理

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    添加站点后,我们开始一键生成对应hosts

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    点击这个按钮启动网站采用多功能集成环境在windows服务器上搭建PHP网站案例

    完美启动,网站程序自己配置即可,这点不会的话,可以百度PHPWAMP使用教程

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    到了这一步,网站只能在服务器上查看,别人通过互联网是访问不了的,因为还有一个重要的步骤要做,那就是域名解析,把域名解析到这个服务器上,全国各地的网名就可以通过互联网访问你这个网站了,下面我们来演示如何解析。

     

    随便在大街上找个IDC服务商,买个域名,然后进入域名管理系统进行域名解析

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

     

    如图进行解析,解析管理系统通常会有提示的,认真看看就会了,实在不行打电话问相关网站的相关客服人员。

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

    如下添加这样的两条解析记录

    采用多功能集成环境在windows服务器上搭建PHP网站案例

     

     

     

    稍等片刻,全国各地网名就都能通过你绑定的域名访问你的网站了。

    采用多功能集成环境在windows服务器上搭建PHP网站案例

    展开全文
  • windows环境下C++代码打印函数堆栈调用情况

    千次阅读 多人点赞 2019-09-04 15:38:39
    程序运行的过程中,函数之间的是会相互调用的,某一时刻函数之间的调用关系,可以通过函数调用堆栈表现出来,这个调用堆栈所展现的就是函数A调用了函数B,而函数B又调用了函数C,这些调用关系代码中都是静态的,...

    前言

    程序运行的过程中,函数之间的是会相互调用的,在某一时刻函数之间的调用关系,可以通过函数调用堆栈表现出来,这个调用堆栈所展现的就是函数A调用了函数B,而函数B又调用了函数C,这些调用关系在代码中都是静态的,不需要程序运行就可以知道。

    既然函数之间的调用关系可以通过分析代码就可以知道,那么查看函数调用的堆栈是不是作用不大了呢?事实上恰恰相反,查看函数调用堆栈的作用非常大。因为在较大型的项目中,函数之间的调用不是简单的一条线,常常会出现复杂的网状结构,这时如果函数C被调用了,可能不是仅仅是B函数调用过来的,也有可能是D、E、F等函数调用了C函数,所以知道在程序运行时究竟是哪个函数调用了C函数显得很重要,特别是有众多函数会调用C函数的时候。

    查看函数堆栈的作用

    举个例子就明白了,假如C函数中逻辑的执行需要一些特殊条件状态,理论上执行C函数时这些条件都应该满足的,但是程序在运行的过程中有时运行C函数时条件就是不满足的,那就说明有些调用C函数的逻辑分支有问题,无法满足C函数中逻辑所需条件,这时候知道是谁调用C函数导致条件不满足就是确定问题的关键。

    如果是在VS调试状态下,在C函数不满足条件的逻辑中打一个断点,然后运行程序等待断点触发时,就可以通过VS工具自带的调用堆栈窗口,就可以看到程序从主函数main()开始怎样一步步调用的出错的函数C的。

    可实际项目中,出错的时候不总是在VS的调试状态下,也有可能发生在程序实际的工作环境中,这时没有办法通过加断点来查看调用堆栈,如果此时有一个函数,可以打印当前的函数调用堆栈那就太好了,这样我就可以在需要调试的逻辑中,调用这个函数,将当时的函数调用堆栈信息打印到文件中,方便查找程序逻辑问题,这篇文章要做的就是在Windows环境下,利用现有的API实现这样一个函数。

    实现打印堆栈信息的函数

    在Windows系统上想打印函数调用堆栈信息,需要引用头文件<dbghelp.h>,添加库引用DbgHelp.Lib,然后利用函数CaptureStackBackTraceSymFromAddrSymGetLineFromAddr64来获取当时的函数调用堆栈信息,以下的代码实现了一个简单的打印堆栈新的函数,堆栈深度最大设置为12层,实际情况肯定是越深越好,设置为12一般就可以查到问题了。

    #include <windows.h>
    #include <dbghelp.h>
    #include <stdio.h>
    
    #if _MSC_VER
    #define snprintf _snprintf
    #endif
    
    #define STACK_INFO_LEN  1024
    
    void ShowTraceStack(char* szBriefInfo)
    {
        static const int MAX_STACK_FRAMES = 12;
        void *pStack[MAX_STACK_FRAMES];
        static char szStackInfo[STACK_INFO_LEN * MAX_STACK_FRAMES];
        static char szFrameInfo[STACK_INFO_LEN];
    
        HANDLE process = GetCurrentProcess();
        SymInitialize(process, NULL, TRUE);
        WORD frames = CaptureStackBackTrace(0, MAX_STACK_FRAMES, pStack, NULL);
        strcpy(szStackInfo, szBriefInfo == NULL ? "stack traceback:\n" : szBriefInfo);
    
        for (WORD i = 0; i < frames; ++i) {
            DWORD64 address = (DWORD64)(pStack[i]);
    
            DWORD64 displacementSym = 0;
            char buffer[sizeof(SYMBOL_INFO)+MAX_SYM_NAME * sizeof(TCHAR)];
            PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
            pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
            pSymbol->MaxNameLen = MAX_SYM_NAME;
    
            DWORD displacementLine = 0;
            IMAGEHLP_LINE64 line;
            line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
    
            if (SymFromAddr(process, address, &displacementSym, pSymbol) && 
            	SymGetLineFromAddr64(process, address, &displacementLine, &line))
            {
                snprintf(szFrameInfo, sizeof(szFrameInfo), "\t%s() at %s:%d(0x%x)\n", 
                	pSymbol->Name, line.FileName, line.LineNumber, pSymbol->Address);
            }
            else
            {
                snprintf(szFrameInfo, sizeof(szFrameInfo), "\terror: %d\n", GetLastError());
            }
            strcat(szStackInfo, szFrameInfo);
        }
    
        printf("%s", szStackInfo); // 输出到控制台,也可以打印到日志文件中
    }
    
    void func2()
    {
        bool isError = true;
        if (isError)
        {
            ShowTraceStack("error in func2\n");
        }
        else
        {
            printf("this is func2\n");
        }
    }
    
    void func1()
    {
        int sum = 0;
        for (int i = 0; i < 100; ++i)
            sum += i;
    
        func2();
    }
    
    
    int main(int argc, char* argv[])
    {
        printf("hello world\n");
        func1();
    
        return 0;
    }
    

    显示堆栈调用信息

    上面的测试代码中函数的调用逻辑为:main()函数调用func1()函数,然后func1()函数调用func2()函数,当func2()中发生问题的时候打印当时的堆栈信息,然后我们查看一下打印结果

    hello world
    error in func2

    ShowTraceStack() at e:\vs2013projects\trackback\windowstrackback\windowstrackback.cpp:24(0xe01440)
    func2() at e:\vs2013projects\trackback\windowstrackback\windowstrackback.cpp:59(0xe01840)
    func1() at e:\vs2013projects\trackback\windowstrackback\windowstrackback.cpp:74(0xe017c0)
    main() at e:\vs2013projects\trackback\windowstrackback\windowstrackback.cpp:82(0xe018c0)
    __tmainCRTStartup() at f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c:626(0xe01d40)
    mainCRTStartup() at f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c:466(0xe020c0)
    error: 487
    error: 487
    error: 487

    总结

    1. Windows平台下可以利用函数CaptureStackBackTraceSymFromAddrSymGetLineFromAddr64来获取当时的函数调用堆栈信息
    2. 使用上述函数时,需要引用头文件<dbghelp.h>,添加库引用DbgHelp.Lib

    程序源码

    打印堆栈信息–源码传送门

    展开全文
  • 描述环境及认识环境的过程中都需要依靠地图,它主要利用地图类描述其当前环境信息,并随着使用的算法与传感器差异采用不同的地图描述形式,所以构建一张可靠的地图对机器人有着极其重要的作用,那如何构建满足...
  • Windows环境下Unicode编程总结 UNICODE环境设置安装Visual Studio时,选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下。 UNICODE编译设置:C/C++, Preprocessor difinitions 去除_MBCS...
  • 5 个最佳的 Linux 桌面环境

    千次阅读 2018-08-13 10:53:11
    打算把每个桌面都试用一遍,但是那很费时间,而且确实有很多桌面环境可供选择,这就是我发表“最优秀的 Linux 桌面以及他们的优缺点”的目的,本文告诉你选择桌面时需要注意些什么,让我们开始吧。 1. KDE 我想...
  • 第十章《跟忧虑说再见》一、忧虑是健康的大敌1、焦虑和烦躁不安的人,多半不适应现实的世界,而跟周围的环境隔断了所有的关系,缩到了自己的梦想世界,以此解决他所忧虑的问题。 2、最使你轻松愉快的是,健全的...
  • 项目的开发和测试上,团队往往有这样一些情况和要求:  1. 只要是走单元测试,必然要清库  2. 开发人员不想每次重新构建都从一个空库开始重新输入数据,他们希望能够使用一个已有的库  3. 如果新版本的...
  • CentOS7下yum源搭建编程环境

    千次阅读 2017-01-03 00:17:35
    为方便自己和别人这里把学linux的一些环境配置,软件安装,工具应用总结记录一下,其中参考并引用了网络上一些学者技术大牛的博客,由于涉及东西较广,撰写跨度时间较长,如有侵权请及时通知,带来不便请谅解,...
  • Spyder——科学的Python开发环境

    万次阅读 多人点赞 2017-08-10 21:26:14
    Python的开发环境Spyder的入门教程,适合Python初学者和正在寻找Python开发环境的你。 Spyder是使用Python编程语言进行科学计算的...它有一个Editor(编辑器)用于编写代码,Console(控制台)可以评估代码并且在任何
  • 没有任何可执行代码,也不被调度,仅仅进程列表中保留一个位置,记载该进程的退出 状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。 wait  wait 函数是用于使父进程(也就是调用 wait 的进程) ...
  • spring boot 多环境配置读取属性文件

    千次阅读 2017-09-25 08:55:04
    相信很多人选择Spring Boot主要是考虑到它既兼顾Spring的强大功能,还实现快速开发的便捷。我们Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁多的XML配置内容,替代它的是pom....
  • lvs环境搭建

    千次阅读 2018-07-13 12:02:41
    修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置lo接口的别名上,并限制其不响应对VIP地址解析请求。 七、LVS/Tun原理和特点   原有的IP报文外再次封装多一层IP首部,内部IP首部(源...
  • 使用docker搭建开发环境

    万次阅读 多人点赞 2018-09-14 14:32:04
    所以就造成了我得windows下面使用虚拟机.这是最开始的办法.后面得知有vagrant这个东西之后,用了一阵子感觉还不错.但是我使用的时候动不动就会出现一些问题,所以一怒之下决定学学docker.然后使用docker来作为开发...
  • Java8新特性全这儿了!!
  • 阿里工作的这段时间里,都学到了哪些东西

    万次阅读 多人点赞 2019-08-18 21:38:28
    当初我没有参加阿里巴巴的实习,而是选择了直接进行校园招聘,这也是因为当时我对实习的部门不感兴趣,于是校招的时候我就选择了自己感兴趣的部门,也就是现在我所在的蚂蚁金服。 之前就听说过阿里的工作强度,...
  • WebSphere环境搭建实践指南

    千次阅读 2016-06-03 16:38:18
    与 大多数商用应用服务器一样,如果您计划把WebSphere应用服务器(以下简称WAS)用于正式的生产环境或用于性能测试、生产前检验的测试环境,除了 简单地安装步骤外,您还需要做一些额外的检查、规划和配置,来确保您...
  • unix环境高级编程-第七章-进程环境

    千次阅读 2011-11-14 12:49:51
    不想一节节的读了,我想把一个整章看好了,然后进行思考,然后再进行编辑写博客里。我觉得这样可以省的时间来思考,写程序。把每章中最主要的部门拿出来。算是第二遍复习。可以加深我的印象吧。 1进程终止 进程...
  • 华为KubeEdge边缘计算的实践

    万次阅读 多人点赞 2018-12-05 16:09:34
    华为KubeEdge边缘计算的实践摘要1 介绍2 相关工作3 架构和设计3.1 KubeBus3.1.1 Edge Node VPN3.1.2 将边缘节点VPN与容器网络连接...本文中,我们为Edge-cloud通信和执行环境引入了Edge基础架构(KubeEdge)...
  • mysql 高并发环境的解决方案

    万次阅读 2016-05-27 15:50:40
    1)mysql 高并发环境解决方案 分库 分表 分布式 增加二级缓存。。。。。 2)需求分析:互联网单位 每天大量数据读取,写入,并发性高 3)现有解决方式:水平分库分表,由单点分布到多点数据库中,从而降低单点数据库...
  • 随机存储器(RAM)在任何软件运行环境中都是一块非常重要的区域,尤其是内存受限的移动操作系统上。尽管Android的Dalvik虚拟机会进行垃圾回收,但是这不意味着APP就可以忽略所申请及所释放的内存。 为了可以使垃圾...
  • 生产环境的tomcat调优和jvm调化

    万次阅读 2018-01-23 22:04:55
    Tomcat 的缺省配置是不稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至午夜时分唤醒你。对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU 的频率,保证文件系统的读写...
  • 云计算发展有几十年的历史了,随着科技的进步和发展,云技术慢慢渗透到各行各业,企业上云也不再是新鲜...未来几年市场平均增长率20%左右,预计到2022年市场规模将超过2700亿美元。 显然,当“上云”成为各行各业...
  • 高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流程分析 qcril 流程分析,设置sim卡锁 python scons 语法学习 Python 语言之 scons 工具流程分析: ...
  • 驱动开发入门 - 之一:Win7 SP1 x64 驱动开发环境搭建

    万次阅读 多人点赞 2017-10-06 21:48:51
    本文讲述Win7 SP1 x64系统中,如何搭建基于WDK7600的驱动开发环境
  • 最近一直搞Dockerfile文件的配置,需要将k8s上设置的环境变量,传入到Dockerfile里,总算是搞定了。 使用ENTRYPOINT指令来实现,如下: ENTRYPOINT ["sh","-c","java -javaagent:/skywalking-agent/agent/...
  • 高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流程分析 qcril 流程分析,设置sim卡锁 python scons 语法学习 Python 语言之 scons 工具流程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,862
精华内容 33,944
关键字:

在任何环境中都能满足