我有一段Perl代码,有点像下面这样(强烈简化):有一些级别的嵌套子程序调用(实际上是方法),而一些内部代码执行自己的异常处理:
sub outer { middle() }
sub middle {
eval { inner() };
if ( my $x = $@ ) { # caught exception
if (ref $x eq 'ARRAY') {
print "we can handle this ...";
}
else {
die $x; # rethrow
}
}
}
sub inner { die "OH NOES!" }
Run Code Online (Sandbox Code Playgroud)
现在我想更改该代码,以便它执行以下操作:
为每个"冒泡"到最外层(sub outer)的异常打印一个完整的堆栈跟踪.具体来说,堆栈跟踪应该不是在"第一层次停止eval { }".
无需更改任何内部级别的实现.
现在,我这样做的方法是__DIE__在outersub中安装一个本地化的处理程序:
use Devel::StackTrace;
sub outer {
local $SIG{__DIE__} = sub { …Run Code Online (Sandbox Code Playgroud) 我正在尝试在生产网站上记录javascript错误.到目前为止,它与网站中包含的以下代码相得益彰:
function catcherr(errorMessage, url, line) {
var parameters = "msg=" + escape(errorMessage)
+ "&url=" + escape(url)
+ "&line=" + escape(line);
new Image().src = "/error.gif?" + parameters;
return false;
};
window.onerror = catcherr;
Run Code Online (Sandbox Code Playgroud)
我正在尝试向错误添加堆栈跟踪以获取更多信息.这基本上与以下想法一起使用,包括上面的功能:
try { i.dont.exist += 0; } // does not exist - that's the point
catch (e)
{
if (e.stack) // Firefox
{
// do some stuff
Run Code Online (Sandbox Code Playgroud)
我使用jquery,一个简单的例子:
<script type="text/javascript">
jQuery(document).ready(function() {
p.foo += 1; // this should throw an error
// do stuff
});
</script>
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我在jquery的"ready"函数中有错误时,"try {i.dont.exist …
假设你有这些模块:
import module2
def a():
module1.b()
def c():
print "Hi guys!"
Run Code Online (Sandbox Code Playgroud)
import module1
def b():
module1.c()
Run Code Online (Sandbox Code Playgroud)
我想要一个func(a())产生类似输出的函数:(=一个追溯?)
/usr/local/lib/python2.7/dist-packages/test/module1.py
3 def a():
4 module1.b()
1 import module1
/usr/local/lib/python2.7/dist-packages/test/module2.py
3 def b():
4 module1.c()
1 import module2
/usr/local/lib/python2.7/dist-packages/test/module1.py
6 def c():
7 print "Hi guys!"
Run Code Online (Sandbox Code Playgroud)
有可能使用标准模块traceback和/或cgitb和/或inspect我很难从文档中找出这些模块.
我认为它可以做,traceback.print_stack(a())但它只是因为某种原因而一直在加载.我尝试了这些模块中的其他功能但没有成功.
@jterrace
python trapy_module.py:
import trace
def trapy(arg):
tracer = trace.Trace()
tracer.run(arg)
r = tracer.results()
r.write_results()
if __name__ == '__main__':
import random
trapy('random.random()') …Run Code Online (Sandbox Code Playgroud) 当我的应用程序在其设备上崩溃时,我有用户通过电子邮件向我发送堆栈跟踪 在iOS 6之前,它们看起来像这样:
CRASH: NSInvalidArgumentException (*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil)
TRACE: (
0 CoreFoundation 0x355e58a7 __exceptionPreprocess + 186
1 libobjc.A.dylib 0x3798c259 objc_exception_throw + 32
2 CoreFoundation 0x3553a1d7 -[__NSArrayM insertObject:atIndex:] + 186
3 MYAPP 0x0006c0f7 MYAPP + 188663
4 MYAPP 0x000652a3 MYAPP + 160419
5 Foundation 0x3512ac29 __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke_0 + 16
6 Foundation 0x350826d9 -[NSURLConnectionInternalConnection invokeForDelegate:] + 28
7 Foundation 0x350826a3 -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:] + 198
8 Foundation 0x350825c5 -[NSURLConnectionInternal _withActiveConnectionAndDelegate:] + 60
9 CFNetwork 0x34de77f5 _ZN19URLConnectionClient23_clientDidFinishLoadingEPNS_26ClientConnectionEventQueueE + 192
10 …Run Code Online (Sandbox Code Playgroud) 我使用下面的代码来获取方法中的调用方法名称及其参数.
var stackTrace = new StackTrace();
var methodName = stackTrace.GetFrame(1).GetMethod().Name;
var parameters = stackTrace.GetFrame(1).GetMethod().GetParameters();
foreach (var parameterInfo in parameters)
{
var name = parameterInfo.Name;
var value = "How to get value?";
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是获取该参数的值.有任何想法吗?
我们正在使用System.Reflection.Emit在源代码中从源代码生成代码(是的 - 在编译器中).我们使用MarkSequencePoint等向ILGenerator提供正确的符号信息,并启用AssemblyBuilder上的所有调试标志.程序集在编译它的同一进程中保存在内存中,并直接执行.
当使用Visual Studio调试器逐步完成动态生成的代码的源代码时,它实际上工作得很好,并且Visual Studio似乎完全了解代码来自文件和行号的位置.
无论其-当异常被抛出生成的代码,该System.Exception的对象包含堆栈是完全错误的痕迹.它们指向其他(有效但错误的)文件和行号.它获取了类和方法名称,但指向的文件和行号与实例异常的代码路径无关.
指向的文件是如此无关,似乎无法链接到内联或优化.我能看到的唯一模式是它似乎被一些文件所抵消(在一个假想的按字母顺序排序的源文件列表中,汇编是从中构建的).但是,这种模式并非100%一致,而且这与问题的根源相关联似乎是不合理的.
如果我从Exception构造一个System.Diagnostics.Debug对象,它包含相同的错误信息.
我假设.NET运行时使用相同的元数据来构造Exception堆栈跟踪,因为调试器用于单步执行代码,在这种情况下,这种行为非常奇怪.
我试图在处理动态内存中的程序集时,或者如果有人在其他方面遇到过类似的问题,那么这是否是.NET中的一个已知错误.
我有一个非常复杂的java程序,它不会终止.eclipse调试器显示一个可以挂起但没有堆栈跟踪的线程.它被称为"线程-2".
该jstack -l线程的输出是:
"Thread-2" #17 prio=5 os_prio=0 tid=0x00007f1268002800 nid=0x3342 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
Run Code Online (Sandbox Code Playgroud)
我在Thread.start()中添加了一个断点,但我找不到一个名为"Thread-2"的线程.线程刚出现在创建两个"AWT-Event-Queue"线程之后.我不在我的程序中手动创建任何线程.
在主线程和所有其他线程退出并释放JFrame之后,以下线程仍然存在:
Thread [AWT-EventQueue-0] (Running)
Thread [Thread-2] (Running)
Thread [DestroyJavaVM] (Running)
Run Code Online (Sandbox Code Playgroud)
挂起VM时,存在以下线程:
Daemon System Thread [Signal Dispatcher] (Suspended)
Daemon System Thread [Finalizer] (Suspended)
Daemon System Thread [Reference Handler] (Suspended)
Daemon System Thread [Java2D Disposer] (Suspended)
Daemon System Thread [AWT-XAWT] (Suspended)
Thread [AWT-EventQueue-0] (Suspended)
Thread [Thread-2] (Suspended)
Thread [DestroyJavaVM] (Suspended)
Run Code Online (Sandbox Code Playgroud)
如何获取有关此线程的更多信息,或允许它终止?
编辑1:
根据Dependency Hierarchyeclipse pom.xml视图,我使用以下第三方库:
guava 17.0 [compile] …Run Code Online (Sandbox Code Playgroud) 我实施了:
window.onerror = function (m, s, l, c, e) {
}
Run Code Online (Sandbox Code Playgroud)
其中 e 是错误对象。例如,它包含:
ReferenceError: rde is not defined
at Object.bla.cs (domain.pt/bla.js:418:17)
at n.aanv (domain.pt/bla.js:125:29)
Run Code Online (Sandbox Code Playgroud)
如果我 make e.toString(),则只返回第一行。如何获得3条线?谢谢你。
如果您throw使用JavaScript,则抛出的错误通常会传播到window.onerror处理程序,这会停止进一步执行脚本.
有没有办法从函数中获取堆栈跟踪而不会导致执行暂停?
我正在创建一个 React.js 应用程序,在其中我得到这样的堆栈跟踪:
let trace = new Error().stack;
Run Code Online (Sandbox Code Playgroud)
该应用程序是使用创建的 create-react-app
将跟踪发送到服务器时,我得到以下几行:
在 onBlur ( http://localhost:3000/static/js/main.chunk.js:538:82 )
在上面的行中, onBlur是正确的,但文件名不正确。
有没有办法获取在我的项目中命名的文件的名称,而不是main.chunk.js(我假设它是由 webpack 创建的编译文件)?