首页
学习
活动
专区
圈层
工具
发布

Linux+Windows: 程序崩溃时,在 C++ 代码中,如何获取函数调用栈信息

一、前言 二、Linux 平台 三、Windwos 平台 一、前言 程序在执行过程中 crash 是非常严重的问题,一般都应该在测试阶段排除掉这些问题,但是总会有漏网之鱼被带到 release 阶段。...因此,程序的日志系统需要侦测这种情况,在代码崩溃的时候获取函数调用栈信息,为 debug 提供有效的信息。...这篇文章的理论知识很少,直接分享 2 段代码:在 Linux 和 Windows 这 2 个平台上,如何用 C++ 来捕获函数调用栈里的信息。 二、Linux 平台 1....free(symbols); oss << std::endl; std::cout << oss.str(); // 打印函数调用栈信息 } 三、Windwos 平台 在...利用以上几个神器,基本上可以获取到程序崩溃时的函数调用栈信息,定位问题,有如神助! ----

7.5K20

在CC++直接插入汇编代码的方法-内联汇编

__asm语法 __asm关键字用来调用内联汇编,可以出现在任何合法的C或C++声明中。...术语“__asm块”指的是任何单独的一条指令或一组指令,可以不包括在大括号里。...例如: __asm mov al, 4 __asm mov dx, 0xB0008 __asm out dx, al 上面的两个例子所生成的代码是相同的,但是在括号里的__asm块这种方式更具优势...如果想把C或C++代码和__asm块放在同一行,则必须把这个__asm块放在括号里。如果没有括号,编译器就不能确定汇编代码结束和C或C++代码起始的位置。...不像C或C++中的"{}",__asm块中的"{}"不会影响C或C++变量的作用范围。同时,__asm块可以嵌套,嵌套也不会影响变量的作用范围。

1.9K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ASM的备份解析与恢复

    一、如何验证ASM的块头备份块的位置 大家都知道,在Oracle10.2.0.5之前,ASM磁盘的头块并没有自己的备份,因此一旦头块损坏,如果没有以前kfedread备份出来的信息,也就没有办法使用kfed...merge来作头块恢复,特别是如果一个磁盘组中所有的磁盘头块都出现问题(比如被人为地创建了PV),恢复ASM磁盘头块的操作就会非常麻烦。...但是从Oracle 10.2.0.5之后,ASM磁盘的头块会自动备份在另外一个块中,这实际上是Oracle 11g出现的功能,不过经过测试,在Oracle 10.2.0.5版本中,这个备份也是存在的。...同样如果是在Linux下用裸设备作为ASM磁盘,并且用strace进行repair命令的跟踪,也可以得到类似结果。 ? 那么通过kfed命令再来验证一下这两个块是否都标志为头块。...验证结果表示块类型都为DISKHEAD。 ? 那么下一个疑问是,在11gR2以后,ASM磁盘组的AU Size可以指定不同的大小,是不是不同的AU Size下的磁盘头块备份都是在第510个块呢?

    93060

    深入内核:从Oracle ASM自动备份头块到ASMFD

    ,因此一旦头块损坏,如果没有以前 kfed read 备份出来的信息,也就没有办法使用 kfed merge来作头块恢复,特别是如果一个磁盘组中所有的磁盘头块都出现问题(比如被人为地创建了 PV ),恢复...但是从 Oracle 10.2.0.5 之后,ASM 磁盘的头块会自动备份在另外一个块中,这实际上是 Oracle 11g 出现的功能,不过经过测试,在 Oracle 10.2.0.5 版本中,这个备份也是存在的...在 trace 文件中,找到下面这段,可以明确地看到 kfed 程序从第 510 个块中读出 4096 字节,然后再写回到第 0 个块中。...那么下一个疑问是,在 11gR2 以后,ASM 磁盘组的 AU Size 可以指定不同的大小,是不是不同的 AU Size 下的磁盘头块备份都是在第 510个 块呢?...因此对于选用 ASM 存储作为生产环境的用户来说,尽快升级到 10.2.0.5 是明智的选择。 在 Oracle 12c 中,Oracle更是推出了 ASMFD 新特性,防止ASM磁盘收到意外的伤害.

    1.2K80

    asm.js 和 Emscripten 入门教程

    2012年,Mozilla 的工程师 Alon Zakai 在研究 LLVM 编译器时突发奇想:许多 3D 游戏都是用 C / C++ 语言写的,如果能将 C / C++ 语言编译成 JavaScript...据称,asm.js 在浏览器里的运行速度,大约是原生代码的50%左右。 下面就依次介绍 asm.js 的两大语法特点。 1.2 静态类型的变量 asm.js 只提供两种数据类型。...另外,我们都知道,在 C / C++ 里面,字符串是一个字符数组,所以要调用Pointer_stringify()方法将字符数组转成 JS 的字符串。 接着,将这个程序转成 asm.js。..."C"代码块里面,就可以对外输出。...另外,由于 asm.js 的运行速度较快,所以一些计算密集型的操作(比如计算 Hash)可以使用 C / C++ 实现,再在 JS 中调用它们。

    2.6K50

    来谈谈WebAssembly是个啥?为何说它会影响每一个Web开发者?

    而将所有这些事情组合到一起的Web规范有一个众所周知的名字:JavaScript! JavaScript基本上已经成为了Web平台的标准开发语言。...在默认环境下,JavaScript文档其实就是简单的文本文件,先是从服务器下载,然后由浏览器中的 JavaScript引擎解析并编译。用户可以通过Ajax技术在浏览网页时与服务器进行通信。...这意味着浏览器端的性能会得到极大提升,它也使得我们能够实现一个底层构建模块的集合,例如,强类型和块级作用域。...asm.js提供了一个类似于C/C++虚拟机的抽象实现,包括一个可有效负载和存储的大型二进制堆、整型和浮点运算、高阶函数定义、函数指针等。...如果你是将C++代码编译为asm.js,将在浏览器端获得极大的性能提升。 webassembly相较于asm.js的优势主要是涉及到性能方面。

    99470

    Oracle 原版经典ppt首次公开,免费下载:Oracle RAC Internals

    Oracle Domain Services Cluster为在同一个Domain内的其他集群提供了集中的服务,这些服务包括:集中的网格基础架构管理存储库;TFA服务;合并Oracle ASM服务;RHP...参考阅读:YH4 Oracle Flex Clusters 二、ASM存储 12.2中,通过flex ASM能够对ASM磁盘中的文件进行分组管理,这样每个组就可以存放一个库的文件或者一个PDB的文件...数据在节点间的交互有两种情况,一种是当前块的交互,另一种是一致性块的交互。在一致性块的交互过程中,需要在资源的持有节点进行事务回滚,创建一致性块。这时候,回滚的工作也是由LMS进程来完成。...因此,在Oracle 12.2 中,为LMS进程增加了两类slave进程,一类是RMVn进程,负责处理LMS的常规事务,另一类是CRn进程,负责协助LMS在申请一致性块的时候的事务。 ?...这样,当一个节点出现问题,其他节点可以直接进行资源的重新配置过程,无需访问故障节点。 ?

    1.9K70

    来谈谈WebAssembly是个啥?为何说它会影响每一个Web开发者?

    而将所有这些事情组合到一起的Web规范有一个众所周知的名字:JavaScript! JavaScript基本上已经成为了Web平台的标准开发语言。...在默认环境下,JavaScript文档其实就是简单的文本文件,先是从服务器下载,然后由浏览器中的 JavaScript引擎解析并编译。用户可以通过Ajax技术在浏览网页时与服务器进行通信。...这意味着浏览器端的性能会得到极大提升,它也使得我们能够实现一个底层构建模块的集合,例如,强类型和块级作用域。...asm.js提供了一个类似于C/C++虚拟机的抽象实现,包括一个可有效负载和存储的大型二进制堆、整型和浮点运算、高阶函数定义、函数指针等。...如果你是将C++代码编译为asm.js,将在浏览器端获得极大的性能提升。 webassembly相较于asm.js的优势主要是涉及到性能方面。

    78220

    来谈谈 WebAssembly 是个啥?为何说它会影响每一个 Web 开发者?

    在默认环境下,JavaScript 文档其实就是简单的文本文件,先是从服务器下载,然后由浏览器中的 JavaScript 引擎解析并编译。...用户可以通过Ajax技术在浏览网页时与服务器进行通信。...这意味着浏览器端的性能会得到极大提升,它也使得我们能够实现一个底层构建模块的集合,例如,强类型和块级作用域。...asm.js提供了一个类似于C/C++虚拟机的抽象实现,包括一个可有效负载和存储的大型二进制堆、整型和浮点运算、高阶函数定义、函数指针等。...如果你是将C++代码编译为asm.js,将在浏览器端获得极大的性能提升。 webassembly相较于asm.js的优势主要是涉及到性能方面。

    5.2K10

    一波三折:DBA需要头脑冷清思路清晰解决故障以幸存

    扩展空间,然而在给ASM添加新的磁盘空间时又出现了故障,这类问题在很多用户的生产环境中可能也会遇到。...这个错误导致了奇怪的现象:根据错误信息判断,操作已经失败了,但是检查发现这些裸设备在DBCA的ASM配置中已经可见了。 当正在检查这两个错误信息时,同事告诉我节点2上的实例连不上了。...diskgroup was forcibly dismounted ASM的磁盘组首先已经DISMOUNT了,所以后面对于ASM中文件的访问当然会出现问题,只不过我们在阅读日志时,注意力很容易被明显、...仔细检查所有的报错信息以及导致错误产生的原因——添加磁盘组的操作,终于发现了问题的真正原因:当时在给裸设备授权的时候,只在节点1进行了授权,而没有在节点2进行授权,因此节点1上的DBCA配置的ASM实例可以成功地将裸设备加到磁盘组中...尤其是,如果在误入歧途的过程中,执行了破坏性或不可逆转的操作,则可能产生运维事故。由此可见,DBA在诊断、分析和处理问题时,保持头脑的清醒和冷静是多么的重要。 与DBA朋友们共勉。

    1.2K100

    快速上手 WebAssembly 应用开发:Emscripten 使用入门

    在本章中我们将选取 Emscripten 及 C/C++ 语言来简要讲述 WebAssembly 相关工具链的使用,通过较为简单的例子帮助大家更快速地上手 WebAssembly 相关的应用开发。...请放心,在本章中我们将避免复杂难懂的 C/C++ 语言技巧,力求相关示例简单、直接、易懂。...intArrayFromString 会将字符串转化成 UTF8 的字符串数组,由于我们知道 C/C++ 中的字符串是需要 \0 结尾的,因此我们在末尾 concat 了一个 0 作为字符串的结尾符。...在本例中,我们将 result 传递给 EM_ASM 方法,其 $0 为传参的等价替换,若还有更多参数则可以写为 $1、$2等。...使用更多的 Emscripten 的 API 实际上 Emscripten 为了方便我们在 C/C++ 中编写代码,其提供了非常多的 API 供我们使用,其中包括:Fetch、File System、VR

    6K20

    【C++初阶】C++入门

    参考链接: C++继续声明 C++入门  C++关键字命名空间C++输入&输出缺省参数和函数重载为什么C语言不能重载(原理) C++关键字  1、asm _asm是一个语句的分隔符。...例: _asm { mov al,2 mov dx,0xD007 out al,dx } 也可以在每个汇编指令前加_asm _asm mov al,2 _asm mov dx,0xD007 _asm out...try指定try块的起始,try块后的catch可以捕获异常。异常由throw抛出。throw在函数中还表示动态异常规范。...被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 22、namespace   C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。...); // 传参时,使用指定的实参 } 一般我们都是在调用时往函数中写参数而缺省函数就可以在定义函数的时候写好默认的参数,如果没有传参函数就会以默认的数据执行,方便我们对函数数据的修改。

    1.5K30

    VC++ 崩溃处理以及打印调用堆栈

    ,从这个角度上来说,我们可以很容易理解为什么在一般的高级语言中一般会先找与try块最近的catch块,然后在找它的上层catch,由里到外依次查找。...在Windows中针对异常处理,扩展了__try 和 __except 两个操作符,这两个操作符与c++中的try和catch非常相似,作用也基本类似,它的一般的语法结构如下: __try { //...异常处理块,指的是except下面的扩号中的代码块....第二种是通过 _set_se_translator 来注册一个将SEH转化为C++异常的方法,在对应的回调中我简单的抛出了一个CBaseException的异常,在具体的代码中只要简单的用c++的异常处理捕获这么一个异常即可...ebp\ __asm mov c.Esp, esp\ } while (0) 在调用StackWalker时只需要关注esp ebp eip的信息,所以这里我们也只简单的获取这些寄存器的环境

    3.9K40

    __asm__ volatile 之 C语言嵌入式汇编

    GCC Inline ASM GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM——GCC内联汇编。...既然两者都会去操作同一块内存,那么任何一方在任何时候都不能对这块内存的内容想当然。...由于立即数在C/C++中只能作为右值,所以对于使用立即数约束的表达式而言,只能放在Input域。...通用约束g是一个非常灵活的约束,当程序员认为一个C/C++表达式在实际的操作中,究竟使用寄存器方式,还是使用内存方式或立即数方式并无所谓时,或者程序员想实现一个灵活的模板,让GCC可以根据不同的C/C+...其次,如果上例中的Output操作表达式"=a"(__out)改为" =r"(__out),那么__out在究竟使用那么寄存器只有到编译时才能通过GCC来决定,既然在我们写代码的时候,我们不知道究竟哪个寄存器被选择

    13.2K45

    关于 Oracle 存储双活配置和实战

    一般而言,本地 Interconnect 传输时延在 1~2ms 之间,本地 IO 的延时则在 8~15ms 之间。...而且由 Interconnect 的时延基数低(1~2ms),导致机房距离产生的时延对整个 Interconnect 影响的占比更大,所以在搭建 Oracle 双活的 RAC 存储架构时需要对各个节点的...' rebalance power 111; 如果出现问题的是仲裁存储这时候我们的操作步骤如下: alter diskgroupOCR drop QUORUM disk OCR_0004 FORCE;...如果存在性能问题时重点关注 AWR 报告中存储的延时情况。...无论是 Oracle 的双活存储还是存储厂商的双活解决方案,均适用于两个存储机房距离小于 50 公里的情况,而且最大的瓶颈在于远端的存储节点写入速度,因此在部署双活存储方案时,提前做好底层的磁盘写入速度测试

    1.4K20

    关于 Oracle 存储双活配置和实战

    一般而言,本地 Interconnect 传输时延在 1~2ms 之间,本地 IO 的延时则在 8~15ms 之间。...而且由 Interconnect 的时延基数低(1~2ms),导致机房距离产生的时延对整个 Interconnect 影响的占比更大,所以在搭建 Oracle 双活的 RAC 存储架构时需要对各个节点的...' rebalance power 111; 如果出现问题的是仲裁存储这时候我们的操作步骤如下: alter diskgroupOCR drop QUORUM disk OCR_0004 FORCE;...如果存在性能问题时重点关注 AWR 报告中存储的延时情况。...无论是 Oracle 的双活存储还是存储厂商的双活解决方案,均适用于两个存储机房距离小于 50 公里的情况,而且最大的瓶颈在于远端的存储节点写入速度,因此在部署双活存储方案时,提前做好底层的磁盘写入速度测试

    2.2K80

    WebAssembly编程实践(1.4) 编译目标及编译流程

    事实上Emscripten的诞生早于WebAssembly,在WebAssembly标准出现前的很长一段时间内,Emscripten的编译目标是asm.js。...以asm.js为编译目标时,C/C++代码被编译为.js文件;以WebAssembly为编译目标时,C/C++代码被编译为.wasm文件及对应的.js胶水代码文件。...我们在实际使用中遇到的主要区别在于模块加载的同步和异步:当编译目标为asm.js时,由于C/C++代码被完全转换成了asm.js(JavaScript子集),因此可以认为模块是同步加载的;而以WebAssembly...在兼容性允许的情况下,应尽量使用WebAssembly作为编译目标。 1.4.2 编译流程 emcc编译C/C++代码的流程如下: ?...C/C++代码首先通过Clang编译为LLVM字节码,然后根据不同的目标编译为asm.js或wasm。

    1.8K10

    从Rust到远方:ASM.js星系

    这个子语言高效的描述>了一个沙盒虚拟机,可以适用于内存不安全的语言,像C或者C++。...静态和动态的组合校验让Javascript可以对有效 的asm.js代码使用一种叫做ahead-of-time(AOT)的编译时优化策略。...它是一个用来编译输出asm.js和WebAssembly的工具链,基于LLVM之上,能够让C和C++程序以接近原生应用的速 度运行在Web上,而且不需要任何插件。...你是否还记得在WebAssembly中作为Javascript边界的Module对象?那和GUTENBERG_POST_PARSER_ASM_MODULE函数返回的完全是一样的。...#结论 我们已经看到ASM.js可以在只支持Javascript的环境中(像IE)作为WebAssembly的备用方案,并可适配环境打开或者关闭ASM.js优化。

    1.6K20

    小朋友学Python(10):CC++JavaPython的关键字

    自动变量,只在定义它们的时候才创建,在定义它们的函数返回时系统回收变量所占存储空间。对这些变量存储空间的分配和回收是由系统自动完成的。一般情况下,不作专门说明的局部变量,均是自动变量。...用于语法: asm-definition: asm ( string-literal ) ; 意义由实现定义,典型实现中传输其中的字符串给汇编器。...auto 在C++98/03中这个这个关键字用于声明块中的变量的生存期为自动生存期,若是对象同时具有自动存储类,即生存期在块结束时结束。这样的变量被称为局部变量。...struct在C++中是特殊的类类型,声明中仅默认隐式的成员和基类访问限定与class不同(struct是public,class是private)。 union是联合体类型。...在C++还有另一个用途——用于类作用域声明,表示声明的成员是类共有的,不需要通过类的对象访问。 sizeof 返回类型名或表达式具有的类型对应的大小。

    1.6K80

    关机重启导致 ASM 磁盘丢失数据库无法启动

    磁盘丢失数据库无法启动,欢迎点击上方蓝字“JiekeXu DBA之路”关注我的公众号,标星或置顶,更多干货第一时间到达!...日志,确实看到 ARCH 盘有两块磁盘,一块是 (/dev/sde),另一块则为空()看不到。.../dev/sdj)属组为 root:disk,这显然是有问题的,正因为这里的属组权限不对,上面最开始查看磁盘 ARCH 盘时仅显示一块(/dev/sde)。...经查看 ASM 实例日志也是 DATA 磁盘组缺失一块磁盘,缺失的磁盘权限也变成 root:disk,如法炮制,修改属组重新挂载即可恢复正常。...(ARCH_0001 和 DATA_0001),而这最后一块盘是后期添加的,那么可能出问题的就是 udev 配置文件了,但是上次通过在 CRT 中的 more 命令查看没有问题,这次用 vi 打开发现最后一行是有换行

    56910
    领券