多使用调用堆栈调试VC++代码

  时间再紧,还是记一下吧!记下小成功与小失败,继续往前。

 故事

 近一天多时间,(其实在前几天中就隐约出现这个BUG,只是当时没有系统地或者频繁地调试运行故没有发现)被一个BUG折磨得够呛!

  现在归纳来看,根本原因还是自己对于开发工具不熟练。今天再次出现这个BUG,因为代码太长了,没有办法,只得大致根据代码执行流程及自己的经验分析诊断。

  今天休息间(临时被BUG折磨,只得休息一下!),忽然想起以前曾经有几次观察过调用堆栈的事情。于是,抓紧时间试一下,果然成功----一只很大的BUG被挖出来了!

 总结

  犯上述错误原因主要在于:代码非常长(近5000行),而且反复修改,有时很多内容无意间修改不完全(这是一种典型的无意间,而且很多人都会出现的错误),导致后期浪费大量时间。

  结论之一是:以后多多使用系统提供的“重构”功能(如今的我使用的VS2012集成开发环境这方面支持个人感觉已经非常优秀),甚至对于较长的子函数也尽可能使用,从而最大限度地避免上述问题!(有时候,个人有些骄傲,在较长函数内部修改就不使用“重构”了!正是这种原因导致上述BUG。)

  结论之二是:出现系统运行错时,多多使用调用堆栈。如今的调用堆栈能够帮助你最近地靠拢出现BUG的源码处,VERY GOOD!看看我的这个截图吧。

只要双击相应的调用堆栈中那一行,源码立即出现在面前。几乎第一时间就帮助你抓住BUG了!

  

时间: 2024-10-08 08:40:46

多使用调用堆栈调试VC++代码的相关文章

【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过JNI的可以看看我之前的博客(Windows下利用Visual Studio开发的过程):http://cherishlc.iteye.com/admin/blogs/1328136 以及自动生成工具swig的

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

title: VC++ 崩溃处理以及打印调用堆栈 tags: [VC++, 结构化异常处理, 崩溃日志记录] date: 2018-08-28 20:59:54 categories: windows 高级编程 keywords: VC++, 结构化异常处理SEH, 崩溃日志记录 --- 我们在程序发布后总会面临崩溃的情况,这个时候一般很难重现或者很难定位到程序崩溃的位置,之前有方法在程序崩溃的时候记录dump文件然后通过windbg来分析.那种方法对开发人员的要求较高,它需要程序员理解内存.寄

VS2015--在 Visual Studio 中调试时映射调用堆栈上的方法

https://msdn.microsoft.com/zh-cn/library/dn194476.aspx 在 Visual Studio 中调试时映射调用堆栈上的方法 创建代码图,以便在调试时对调用堆栈进行可视化跟踪.你可以在图中进行标注以跟踪代码执行的操作,以便专注于查找 Bug. 生成调用堆栈图 1 开始调试.(键盘:"F5") 2 在你的应用进入中断模式或你单步执行某一函数之后,请选择"代码图".(键盘:Ctrl + Shift + `) 当前的调用堆栈在

Page 由于代码已经过优化或者本机框架位于调用堆栈之上

Page.Response.Clear();            Page.Response.Write("<script type=\"text/javascript\">window.frameElement.commonModalDialogClose(1, " + result + ");</script>");            Page.Response.End(); 报错,  Page 由于代码已经过优

由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值

异常: 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值 原因: 如果使用 Response.End.Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException 异常.您可以使用 try-catch 语句捕获此异常.Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件.不执行 Response.End 后面的代码行.此问题出现在

1,由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

ylbtech-Error-WebForm: 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值. {由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值.} 1.A,错误代码返回顶部 Tip:{由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值.} 1.B,出错原因分析返回顶部 1.C,相关解决方法返回顶部 作者:ylbtech出处:http://ylbtech.cnblogs.com/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此

c# 多线程 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值

在网上找到一段解释: 堆栈是用于存放变量和方法,"位于调用堆栈之上",我们可以理解为堆栈里面已经没有变量和方法可以调用了,其实也就是程序已经结束了,堆栈都空了(指针在原本堆栈的外部--之上).放在我的实际场景里面:我开了一个异步去处理一个事件,而主线程并没有等待这个异步就直接结束了,实际上就是主线程关闭了,异步却还在运行,结果就是内存都释放了,异步当然找不到变量了,就报错了. 触发场景:多线程跑大数据量或者很复杂的计算逻辑的时候,执行时间超过20分钟,线程被IIS自动回收了 解决方案:

VC++代码的汇编分析(一)

VC++代码是最接近汇编指令的高级语言,为了更加准确和深刻理解VC++编码中所涉及的很多技术概念和编译器参数的含义,从汇编指令层面进行剖析和解读,有助于开发者更加准确.直观.深刻理解高级语言中很多概念和技术的真正含义,对程序优化和编码都有非常实用的重要价值.由于内容很多,我会分解为很多篇章进行解读实例. 从main入口开始分析,使用古老的VC6.0编译器编译,先从最简单的例子开始逐步扩展,便于大家逐步入门. VC++源代码: int main(int argc, char* argv[]) {p

程序中打印当前进程的调用堆栈(backtrace)

为了方便调式程序,产品中需要在程序崩溃或遇到问题时打印出当前的调用堆栈.由于是基于Linux的ARM嵌入式系统,没有足够的空间来存放coredump文件. 实现方法,首先用__builtin_frame_address()函数获取堆栈的当前帧的地址(faddr), ×faddr(栈帧的第一个单元存放的数据)即当前函数的返回地址,及调用函数中的指令地址.×(faddr-1)是调用函数的栈帧的地址,即栈帧中保存了调用函数的栈帧的地址.由此可知,同一线程的所有栈帧组成了一个链表.遍历此链表,就可以打印