我有一段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) Java的e.printStackTrace()不会打印内部异常的堆栈跟踪的所有细节.
有没有现成的方法以字符串形式生成完整的堆栈跟踪?(除了自己格式化)
编辑
我刚刚发现了printStackTrace()的作用 - 显然它过滤掉的堆栈帧正是内部异常和外部异常共有的堆栈帧.所以实际上它是我想要的,而不是"完整"的堆栈跟踪.
我正在尝试在生产网站上记录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 …
在我自豪的rails应用程序中,我得到了所有类型的随机攻击请求asp,zip和rar文件.Rails按预期呈现404页面,但我的生产日志文件被如下所示的RoutingError stacktrace转储所堵塞.
我的问题是:我可以在Apache/Passenger中阻止某些模式的URL吗?或者至少我可以配置Rails只记录错误本身而不是打印整个堆栈跟踪?谢谢!
Processing ApplicationController#index (for 100.222.237.7 at 2011-03-22 10:59:54) [GET]
ActionController::RoutingError (No route matches "/include/upfile_flash.asp" with {:host=>"www.myhost.com", :method=>:get, :domain=>"myhost.com", :subdomain=>"www"}):
passenger (2.2.15) lib/phusion_passenger/rack/request_handler.rb:92:in `process_request'
passenger (2.2.15) lib/phusion_passenger/abstract_request_handler.rb:207:in `main_loop'
passenger (2.2.15) lib/phusion_passenger/railz/application_spawner.rb:441:in `start_request_handler'
passenger (2.2.15) lib/phusion_passenger/railz/application_spawner.rb:381:in `handle_spawn_application'
passenger (2.2.15) lib/phusion_passenger/utils.rb:252:in `safe_fork'
passenger (2.2.15) lib/phusion_passenger/railz/application_spawner.rb:377:in `handle_spawn_application'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:352:in `__send__'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:163:in `start'
passenger (2.2.15) lib/phusion_passenger/railz/application_spawner.rb:222:in `start'
passenger (2.2.15) lib/phusion_passenger/spawn_manager.rb:253:in `spawn_rails_application'
passenger (2.2.15) lib/phusion_passenger/abstract_server_collection.rb:126:in `lookup_or_add'
passenger (2.2.15) lib/phusion_passenger/spawn_manager.rb:247:in `spawn_rails_application'
passenger (2.2.15) lib/phusion_passenger/abstract_server_collection.rb:80:in …Run Code Online (Sandbox Code Playgroud) 我真的虽然在网上找到答案,但我不能.有什么不同吗?人们说在抛出异常时会产生"回溯",而堆栈跟踪则是从应用程序启动时到抛出异常的点的方法调用列表.如果我们将堆栈跟踪视为数组,则最后一个元素将是抛出异常的方法.回溯的情况是否相反?例如,在像Ruby这样的编程语言中,如果我们有:
begin
raise 1
rescue
p $!.backtrace ; p caller(0) #=> displays the back-trace, then the stack-trace
end
Run Code Online (Sandbox Code Playgroud)
他们将输出2个不同的阵列,这对我来说,他们有一些根本不同的东西.
如果您throw使用JavaScript,则抛出的错误通常会传播到window.onerror处理程序,这会停止进一步执行脚本.
有没有办法从函数中获取堆栈跟踪而不会导致执行暂停?
几天前,我得到了一张支持票NullPointerException:
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract com.redacted.SalesResponsePagination com.redacted.StatisticsService.findSalesData(com.redacted.ConfStats) throws com.redacted.AsyncException' threw an unexpected exception: java.lang.NullPointerException
at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:389)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:579)
at ... (typical GWT + Tomcat stacktrace)
Caused by: java.lang.NullPointerException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.util.concurrent.ForkJoinTask.getThrowableException(Unknown Source)
at java.util.concurrent.ForkJoinTask.reportException(Unknown Source)
at java.util.concurrent.ForkJoinTask.invoke(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.ReferencePipeline.forEach(Unknown Source)
at com.redacted.StatisticsControllerImpl.replacePrices(StatisticsControllerImpl.java:310)
at com.redacted.StatisticsControllerImpl.findSalesData(StatisticsControllerImpl.java:288)
at com.redacted.StatisticsServiceImpl.findSalesData(StatisticsServiceImpl.java:83)
at sun.reflect.GeneratedMethodAccessor752.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud) 我有一个来自用户的控制台堆栈(不是崩溃报告),我正在尝试确定我的应用程序中哪个方法调用是最后一个人.
我知道他们正在使用哪个版本的应用程序,并且我有一个该发布/调试版本的副本,以及存档副本的dSYM文件.
但是,当我尝试使用atos吐出内存地址时,它似乎没有帮助.(我在0x000000010e703bc0下面的堆栈中使用.)
craig-mbp:Desktop Craig$ atos -o MyApp.app_1.0.0.dSYM/Contents/Resources/DWARF/MyApp -arch x86_64
0x000000010e703bc0 (<- entered by me)
0x000000010e703bc0 (<- console output)
Run Code Online (Sandbox Code Playgroud)
我需要输入某种偏移吗?或者根据用户提供给我的地址,某种内存地址数学来确定程序内存块中的实际位置?
这是我收到的堆栈跟踪的总和:
28/11/12 10:48:56.220 AM MyApp[411] (
0 CoreFoundation 0x00007fff8fee90a6 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff8e94a3f0 objc_exception_throw + 43
2 CoreFoundation 0x00007fff8fee8e7c +[NSException raise:format:] + 204
3 Foundation 0x00007fff92b1ce5c -[NSPlaceholderString initWithString:] + 93
4 Foundation 0x00007fff92b1cde4 +[NSString stringWithString:] + 43
5 MyApp 0x000000010e703bc0 MyApp + 23488
6 MyApp 0x000000010e70a038 MyApp + 49208
7 MyApp 0x000000010e70b41a MyApp + …Run Code Online (Sandbox Code Playgroud) 当在IE 8中抛出JavaScript异常时,如何查看其堆栈跟踪?
例如,jQuery中的以下代码捕获异常并重新抛出它.在Visual Studio(2012)中进行调试时,执行会在jQuery捕获异常('e')时中断,但我不能在生命中看到异常源自的堆栈跟踪:
// resolve with given context and args
resolveWith: function( context, args ) {
if ( !cancelled && !fired && !firing ) {
firing = 1;
try {
while( callbacks[ 0 ] ) {
callbacks.shift().apply( context, args );
}
}
// We have to add a catch block for
// IE prior to 8 or else the finally
// block will never get executed
catch (e) {
throw e;
}
finally {
fired = [ context, args …Run Code Online (Sandbox Code Playgroud) javascript debugging exception stack-trace internet-explorer-8
我使用cocos2d-x开发游戏,在iOs中运行完美后,我转向Android平台.
但它在android中运行,我只收到一些错误日志:
08-26 10:49:23.823: A/libc(2884): Fatal signal 11 (SIGSEGV) at 0x0000000c (code=1), thread 2917 (Thread-285)
Run Code Online (Sandbox Code Playgroud)
有了这个,我无法修复崩溃日志.
所以我的问题是如何检查崩溃日志的堆栈?
在SO中,有一些类似的问题,但对我没有任何有用的答案.
stack-trace ×10
javascript ×3
debugging ×2
java ×2
android ×1
android-ndk ×1
backtrace ×1
c++ ×1
cocos2d-x ×1
eval ×1
exception ×1
jit ×1
jquery ×1
lambda ×1
logging ×1
objective-c ×1
onerror ×1
perl ×1
production ×1
reflection ×1
ruby ×1
xcode ×1