我想在Native C++应用程序中运行时访问调用堆栈.我没有使用IDE.如何显示调用堆栈?
更新:我有一个函数,从整个应用程序的许多点调用.它在极少数情况下崩溃.我正在寻找一种方法来获取调用者的名字并记录它.
MySpace.com的首席系统架构师Dan Farino 发表了精彩的演示,展示了一个基于Web的堆栈转储工具,该工具对在给定流程中运行的所有线程进行编目(他们正在做什么,他们执行了多长时间等等) .)
他们的技术也在highscalability.com上进行了总结:
问题是:为ASP.NET构建基于Web的堆栈转储工具需要哪些工具?为方便起见,我们假设在目标AppDomain中托管的*.aspx能够输出该进程中的所有托管调用堆栈就足够了.
有一些帖子涵盖了Mdbg的使用(完全用C#/ IL编写的托管代码的调试器,开始随CLR 2 SDK一起提供)和mdbgcore程序集通常位于C:\ Program Files\Microsoft Visual Studio 8\SDK\2.0 \斌:
解决方案是否会简单地引用此组件以产生所需的输出?"列出所有托管调用堆栈"操作对正在为生产流量提供服务的运行进程有什么影响?
我在Windows XP上使用ActivePerl 5.8.
use strict;
use warnings;
use Data::Dumper;
Run Code Online (Sandbox Code Playgroud)
我的脚本中使用了三个子例程.
要检测调用堆栈,我只能插入一些print "some location";并从控制台窗口检查打印结果.
有什么好方法可以监控它吗?谢谢.
我想创建一个函数,如果失败,将重试表达式.这是我的工作版本:
retry <- function(.FUN, max.attempts=3, sleep.seconds=1) {
x <- NULL
if(max.attempts > 0) {
f <- substitute(.FUN)
x <- try(eval(f))
if(class(x) == "try-error") {
Sys.sleep(sleep.seconds)
return(suppressWarnings(retry(.FUN, max.attempts-1)))
}
}
x
}
retry(stop("I'm here"))
Run Code Online (Sandbox Code Playgroud)
如果我删除suppressWarnings()上面的函数,那么每次递归调用都会收到一组警告.有谁知道我做错了会导致什么?
这是一个可以重复运行的示例:
retry({ tmp <- function() { if(rnorm(1) < 0) stop("I'm here") else "success" }; tmp() })
Run Code Online (Sandbox Code Playgroud) 我有基于类 ServiceBase 的常规 C# 服务。此服务在启动时加载 c++ 动态链接库。有时会发生服务在非托管代码中崩溃。不幸的是,事件查看器仅对此进行了非常简短的描述。如果他的消息是这样的:
应用程序:StreamMapService.exe 框架版本:v4.0.30319 描述:由于未处理的异常,进程被终止。异常信息:异常代码 c0000005,异常地址 00000012"。
99% 确定问题出在非托管代码中。问题是这种情况很少发生(通常每天一次),并且仅在作为服务运行时发生。在调试器下一切正常。为了找出有问题的代码,我按以下方式编辑了我的主要方法:
static void Main()
{
try
{
if (!Environment.UserInteractive)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
else
{
var services = new Service1();
services.Start();
Console.WriteLine("Press return to exit");
Console.ReadLine();
services.Stop();
}
}
catch (SEHException e)
{
// wrapper for all exceptions having its origin in unmanaged code
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Crash time: {0}\n", DateTime.Now.ToString());
sb.AppendFormat("\nMessage:\n{0}", e.Message);
sb.AppendFormat("\nSource: {0}\n", e.Source); …Run Code Online (Sandbox Code Playgroud) 有没有办法在 C++ 中获取调用堆栈的大小(以字节为单位)?
或者至少是它的底部地址(然后我可以从 ESP 寄存器中减去它?
问题是没有得到一般的callstack,这可以按照这里描述的方式完成:http: //eriwen.com/javascript/js-stack-trace/ ,而是访问触发事件的callstack,来自处理程序事件.
特别是我有兴趣从窗口错误事件中记录callstack
window.onerror = function(msg, url, line) {
//callstack // would be nice to have.
//log callstack or whatever. (note this can be done w/ ajax and service, and is not the question at hand.
}
Run Code Online (Sandbox Code Playgroud)
但我知道如何记录错误.(我使用jquery .ajax和服务)
浏览器能否实现这一目标?目前有可能吗?也许我会以错误的方式解决这个问题.如何添加一个简单的函数(即不修改我的代码库中的所有函数)来检测何时出现错误,并记录调用堆栈.
到目前为止,感谢您的答案,如果问题最初措辞不当,那就很抱歉.
大家好,我希望你帮我解决这个问题:
我目前正在为脚本语言实现一个解释器.该语言需要一个C函数的本机调用接口,比如java有JNI.我的问题是,我想调用原始的C函数而不编写包装函数,它将我的脚本语言的调用堆栈转换为C调用堆栈.这意味着,我需要一种方法,在运行时生成C函数的参数列表.例:
void a(int a, int b) {
printf("function a called %d", a + b);
}
void b(double a, int b, double c) {
printf("function b called %f", a * b + c);
}
interpreter.registerNativeFunction("a", a);
interpreter.registerNativeFunction("b", b);
Run Code Online (Sandbox Code Playgroud)
解释器应该能够调用函数,只知道我的脚本语言的函数原型:native void a(int a, int b);和native void b(double a, int b, double c);
有没有办法在C++中生成C函数调用堆栈,或者我必须使用汇编程序来完成此任务.汇编程序是一个问题,因为解释器应该几乎可以在任何平台上运行.
编辑:解决方案是使用libffi,一个库,处理许多不同平台和操作系统的调用堆栈创建.libffi也被一些着名的语言实现使用,如cpython和openjdk.
编辑:@MatsPetersson我的代码中有一个方法,我有一个方法:
void CInterpreter::CallNativeFunction(string name, vector<IValue> arguments, IReturnReference ret) {
// Call here correct native C function.
// this.nativeFunctions is a map which contains the …Run Code Online (Sandbox Code Playgroud) 我是一名开发人员,难以区分Call Stack和Task Queue两个术语。有没有人可以帮我解释一下区别?
提前致谢。
我试图了解callR中的对象是什么,并将其强制转换为角色.然而,到目前为止,我的努力是徒劳的.
myFun=function(a=1) { x=sys.call() return(as.character(x)) }
x=myFun(a=2) # here I would like to get the string "myFun(a = 2)"
Run Code Online (Sandbox Code Playgroud)
我一直在寻找打印函数调用的函数(类似的东西print.call).但我找不到它.
这里有人知道如何打印调用对象吗?