草庐IT

callstack

全部标签

c++ - 调试堆栈损坏问题

我正在C++(VisualStudio2015)中的大型应用程序上调试“访问冲突”异常。该应用程序是由多个库构建的,问题发生在其中一个(SystemC)上,尽管我怀疑问题的根源在别处。我看到的是一个函数调用,它破坏了调用者的成员函数的地址。m_update_phase=true;m_prim_channel_registry->perform_update();m_update_phase=false;inlinevoidsc_prim_channel_registry::perform_update(){for(inti=m_update_last;i>=0;--i){m_updat

c++ - 在 C++ 中动态创建函数调用

大家好我希望你们能帮我解决这个问题:我目前正在为一种脚本语言实现解释器。该语言需要一个对C函数的本地调用接口(interface),就像java具有JNI一样。我的问题是,我想在不编写包装函数的情况下调用原始C函数,它将我的脚本语言的调用堆栈转换为C调用堆栈。这意味着,我需要一种方法来在运行时生成C函数的参数列表。示例:voida(inta,intb){printf("functionacalled%d",a+b);}voidb(doublea,intb,doublec){printf("functionbcalled%f",a*b+c);}interpreter.registerNa

c++ - 在 C++ 中将调用堆栈扩展到磁盘?

当涉及到大规模递归方法调用时,必须通过修改适当的编译器参数来扩展调用堆栈大小,以避免堆栈溢出。让我们考虑编写一个布局足够简单的可移植应用程序,以便其用户只需要具备最少的技术知识,因此手动虚拟内存配置是不可能的。运行大规模递归方法(显然在幕后)可能会导致超过调用堆栈限制,尤其是在运行应用程序的机器内存有限的情况下。聊够了:在C++中,是否可以手动将调用堆栈扩展到磁盘以防内存(几乎)已满? 最佳答案 这可能只是勉强可能。使用协程库。这样,您就可以从堆中分配自己的堆栈。重组您的代码以跟踪它在调用堆栈中的深度,当它变得危险时,创建一个新的c

php - 我可以用 PHP 打印整个程序状态吗?

PHP提供了一些令人印象深刻的内省(introspection)工具:get_defined_vars、get_defined_functions、get_defined_constants、debug_backtrace等。本质上,这些提供了整个程序状态的View:堆栈和堆。我想知道使用这些工具可以获得多完整的程序状态View。堆和范围内所有定义的变量都可以建模为带标签的有向图。那么是否有可能,例如,写一些东西给我一个Graphviz/DOT描述?我在想象类似于thisarticleabout'HowPHPmanagesvariables'中图表的东西,或thePHPmanualpa

Android 应用程序因 ResourceNotFoundException 而崩溃

我最近检查了我的GP崩溃日志,我经常收到这个调用堆栈。请你帮助我好吗。一些事情:添加资源路径失败有时显示/data/app/com.xxx.xxx.xxx-x/base.apk,有时显示/mnt/asec/com.xxx.xxx.xxx-x/base.apk.设备的安卓版本(报告的地方)不同于安卓4.4。到Android7.0在GP控制台中,Android版本显示所有崩溃的Android7.0,但设备列表包含Android版本6.0、5.0、等等不清楚。我有两个具有共享用户ID的应用程序,例如包名称P1、P2。对于P1,添加资源路径失败有时显示/data/app/P2,有时显示/mnt

c++ - 为什么 malloc/new 捕获调用堆栈?

我有一个在Server2003下作为服务运行的64位应用程序。当我附加VSProfiler或windbg时,我看到很多调用堆栈,如下所示。我知道调试器(或探查器)中产生的进程使用调试堆等...但情况并非如此,因为该服务是由操作系统启动的,而我只是附加到它。我不明白为什么要展开堆栈。探查器显示这样做花费了可测量的时间。更多信息:•这些是使用vc9构建的版本位,在Server2003上运行。•系统环境变量_NO_DEBUG_HEAP设置为1。•我正在使用Microsoft符号服务器。为什么要捕获堆栈跟踪?它似乎正在记录它..但我找不到位置。我的目标是验证应用程序是否真的展开堆栈,如果是这样

c++ - Stack Walking 一个被调试的进程

我正在使用打开一个进程(使用C++/Windows)if(CreateProcessA(NULL,//Nomodulename(usecommandline)(LPSTR)path,//argv[1],//CommandlineNULL,//ProcesshandlenotinheritableNULL,//ThreadhandlenotinheritableFALSE,//SethandleinheritancetoFALSEcreationFlags,//NocreationflagsNULL,//Useparent'senvironmentblockNULL,//Useparen

c++ - 如何在 Windows 中以编程方式从调用堆栈帧中读取函数参数?

我试图遍历调用堆栈帧并从中提取一些信息。我能够使用来自WinDBG的StackWalk64、SymGetSymFromAddr64和SymGetLineFromAddr64API提取文件名、行号和函数名。但是STACKFRAME64中的DWORD64Params[4]是StackWalk64的返回值,只支持回读4个64位来自帧的函数参数。更糟糕的是,在32位系统上,仅使用Params[4]的低32位,因此超过32位的单个参数需要两个或更多元素。typedefstruct_tagSTACKFRAME64{ADDRESS64AddrPC;ADDRESS64AddrReturn;ADDRES

swift - 你能装饰一个破坏调试的函数,而不是在调用该函数的地方中断吗?

这最好用一个例子来解释。考虑这个mustOverride辅助函数:funcmustOverride(callSite:String=#function)->Never{preconditionFailure("\(callSite)mustbeoverriddeninasubclass")}我们用它来制作仿抽象类,如下所示://Faux'abstract'classclassSoundBase{funcplay(){mustOverride()}}//'Concrete'classclassCatSound:SoundBase{overridefuncplay(){//playcat'

java - 'this' 引用是否存储在 Java 的调用堆栈中?

我们已经知道,在Java中调用方法时,参数和局部变量会被存储在栈中。例如下面的代码:publicclassTest{intx=10;inty=20;voidtest(inty){intz=y;this.x=y;//HowJVMknowswhereisourcurrentobject?}publicstaticvoidmain(String[]args){Testobj=newTest();obj.test(3);}}当我们调用obj.test()时会产生如下调用堆栈:||+-------------+|z||y|obj.test()+-------------+|obj|main()+