如何找出谁在Java中创建了一个Thread?
想象一下:您在复杂的插件环境中使用~30 个第三方 JAR.你启动它,运行大量代码,做一些计算,最后调用shutdown().
这个生命周期通常可以正常工作,除了在每次运行中一些(非守护)线程保持悬空状态.如果每次关机都是最后一次关机,那就不会有问题,在这种情况下我可以简单地运行System.exit().但是,这个循环可能会运行几次,并且每次传递都会产生更多的垃圾.
所以我该怎么做?我在Eclipse的Debug View中看到了线程.我看到他们的堆栈痕迹,但他们没有任何关于它们的起源的暗示.没有创建者的堆栈跟踪,没有可区分的类名,没有.
有谁知道如何解决这个问题?
我确实有一个jenkins实例,它被卡在某种无限循环中而没有任何可见的活动.
我可以获取pid正在运行的进程,那么如何生成可用于错误报告的跟踪?
我在linux上运行.
今天我发现需要跟踪和检索Javascript错误堆栈跟踪来解决它们.
今天我们能够捕获所有其余的调用,这个想法是,一旦出现错误,自动发布该错误的堆栈跟踪以及其余已保存服务的响应,以便我们可以检测,重现和解决几乎相同的问题环境/局面.
作为一项要求,我们被要求制作一个可以包含而不会被侵入的模块,例如: 在一个JS中包含包含钩子逻辑的模块,将不是侵入性的,在各种JS文件中包含几行代码将是侵入性的.
目标是制作一个可以包含在已经开发的系统中的工具并跟踪错误事件(如控制台).
我已经读过这个跟踪器逻辑了:
我们需要做类似的事情,跟踪错误并将其发送到我们的服务器.
正如"Dagg Nabbit"所说的那样...... "现在正在疯狂地发生错误,很难得到堆栈跟踪 ......"
所以,我们得到了很多付费产品,但它们是如何运作的呢?
在Airbrake中,他们使用stacktrace和window.onerror:
window.onerror = function(message, file, line) {
setTimeout(function() {
Hoptoad.notify({
message : message,
stack : '()@' + file + ':' + line
});
}, 100);
return true;
};
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚堆栈跟踪何时真正使用.
在某些时候,stacktrace,raven.js和其他跟踪器需要try/catch.
当客户端发生意外错误时,如何将堆栈跟踪发送到我的服务器?任何建议或良好做法?
这是一个后续问题,"throw"和"throw ex"之间有区别吗?
有没有办法提取新的错误处理方法而不重置堆栈跟踪?
[编辑] 我将尝试"内部方法"和Earwicker提供的另一个答案,看看哪一个可以更好地标记答案.
发生正常异常时,会输出如下所示的堆栈跟踪:
util.js:38
case '%s': return String(args[i++]);
^
TypeError: Cannot convert object to primitive value
at String (unknown source)
at util.js:38:25
at String.replace (native)
at Object.<anonymous> (util.js:35:23)
at Object.<anonymous> (console.js:25:36)
at EventEmitter.<anonymous> (/project/src/routines/debug/boot.js:16:21)
at EventEmitter.emit (/project/node_modules/eventemitter2/lib/eventemitter2.js:319:22)
at /project/src/bootstrap.js:15:14
at /project/src/util/routineloader.js:36:11
at /project/src/util/routineloader.js:47:6
Run Code Online (Sandbox Code Playgroud)
哪个非常有帮助.当我在某处做以下事情时:
process.on('uncaughtException', function(err) {
console.trace();
throw err;
});
Run Code Online (Sandbox Code Playgroud)
我只得到:
Trace:
at EventEmitter.<anonymous> (/project/src/routines/debug/exceptions.js:4:17)
at EventEmitter.emit (events.js:88:20)
Run Code Online (Sandbox Code Playgroud)
这根本没有用.
如何让它返回整个堆栈跟踪,就像原始堆栈跟踪一样?
我有许多方法正在调用Delegate.DynamicInvoke.其中一些方法会进行数据库调用,我希望能够捕获一个SqlException而不是TargetInvocationException通过它的内部捕获并查找实际出错的方法.
我正在使用此方法重新抛出但它清除了堆栈跟踪:
try
{
return myDelegate.DynamicInvoke(args);
}
catch(TargetInvocationException ex)
{
Func<TargetInvocationException, Exception> getInner = null;
getInner =
delegate(TargetInvocationException e)
{
if (e.InnerException is TargetInvocationException)
return getInner((TargetInvocationException) e.InnerException);
return e.InnerException;
};
Exception inner = getInner(ex);
inner.PreserveStackTrace();
throw inner;
}
Run Code Online (Sandbox Code Playgroud)
这个PreserveStackTrace方法是我通过另一个帖子修复的扩展方法(我不知道它实际上做了什么).但是,这似乎不会保留跟踪:
public static void PreserveStackTrace(this Exception e)
{
var ctx = new StreamingContext(StreamingContextStates.CrossAppDomain);
var mgr = new ObjectManager(null, ctx);
var si = new SerializationInfo(e.GetType(), new FormatterConverter());
e.GetObjectData(si, ctx);
mgr.RegisterObject(e, 1, si);
mgr.DoFixups();
}
Run Code Online (Sandbox Code Playgroud) c# exception-handling stack-trace targetinvocationexception inner-exception
有没有办法在Linux上检查正在运行的Python守护进程正在做什么?也就是说,没有检测代码而没有终止它?我希望得到模块的名称和当前正在运行的行号.
常规调试工具(如strace,pstack和gdb)对Python代码不是很有用.大多数堆栈帧只包含来自解释器代码的函数,如PyEval_EvalFrameEx和PyEval_EvalCodeEx,它不会在执行的.py文件中提供任何提示.
在Django中,大多数情况下,当我运行manage.py并遇到错误时,我没有得到错误的完整堆栈跟踪,只是异常的文本,这使得调试非常困难.例:
python manage.py graph_models -a -g -o my_project.png
AttributeError: 'str' object has no attribute '__module__'
Run Code Online (Sandbox Code Playgroud)
(这是针对graph_models附加组件的,但它也适用于内置命令.我发现的唯一例外是runserver,遇到与其他命令相同的错误但打印完整的堆栈跟踪)
这是我的manage.py文件.我的项目最初是为Django 1.1创建的,但我最近升级到了1.5.
#!/usr/bin/env python
import os, sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ctree.settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
Run Code Online (Sandbox Code Playgroud) 这个问题出于好奇,才能更好地了解我们的朋友Stack Trace.
作为C#(.NET)开发人员,每个人都必须看到如下所示的黄色堆栈跟踪.

其中的大多数内容都很容易理解,就像消息Attempt to divide by zero和方法一样,Page_Load甚至也会出现.cs文件的路径.但经过3年的经验,我仍然不知道事情是如何处理+在方法结束标志的数字表示在这里,像+51,+92,+54和+772.
有人知道这些是什么吗?
当我在项目中启用Dexguard时,我遇到了来自Fabric Crashlytics的崩溃报告的问题.
我在项目中启用了Dexguard,效果非常好.然后我按照本页中的说明添加了所提到的配置,以使Fabric对我的堆栈跟踪进行去混淆并显示正确的崩溃报告.以下是我在主模块中应用fabric和dexguard插件的方法build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'dexguard'
apply plugin: 'io.fabric'
Run Code Online (Sandbox Code Playgroud)
以下是我proguard-project.txt文件中的配置:
# Fabric
#############################################################################
-keepattributes *Annotation*,SourceFile,LineNumberTable
-keep public class * extends java.lang.Exception
-keepresourcexmlelements manifest/application/meta-data@name=io.fabric.ApiKey
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
#############################################################################
Run Code Online (Sandbox Code Playgroud)
以下是我proguard-project.txt在发布版本中的使用方法:
buildTypes{
debug{
proguardFile getDefaultDexGuardFile('dexguard-debug-shrink.pro')
proguardFile 'proguard-project.txt'
}
release{
proguardFile getDefaultDexGuardFile('dexguard-release.pro')
proguardFile 'proguard-project.txt'
proguardFile 'dexguard-project.txt'
if(new File("$projectDir/../local.properties").exists()){
signingConfig signingConfigs.release
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是当在发布版本中遇到崩溃时,发生崩溃的文件名将丢失,但其他所有内容都正常工作,并且堆栈跟踪几乎是可以理解的.这是一个崩溃报告示例:
正如您在崩溃报告中看到的那样,堆栈跟踪中只缺少文件名.行号和方法名称等其他描述完全正常.
虽然使用完整的方法名称ir.X.ui.XMainActivity.throwSomething和前面的行号Unknown Source,但我可以得出错误发生的文件名,我希望我的堆栈跟踪显示文件名并完全描述自己.我尝试了很多选项和许多试验和错误,但问题仍然存在.
有什么我想念的吗?我怎么解决这个问题?
我正在使用8.1.0.7Dexguard版本1.21.7,Fabric插件版本2.9.0 …
android stack-trace dexguard crashlytics-android google-fabric