可以在调用方法内部获得方法调用的堆栈跟踪
本文关键字:调用 方法 堆栈 跟踪 内部 | 更新日期: 2023-09-27 18:19:06
我想在调用方法级别向日志记录器添加更多信息,并且我需要知道是否存在获得StackTrace方法调用内部调用的可能性。
UPDATE:这样做的目的是绘制所有被调用方法的流程,直到调用方法内部的某个步骤。
例子:
public class Type1
{
internal string method2_T1() {
return new Type2().method1_T2();
}
}
public class Type2
{
public string method1_T2()
{
return "Type2.method1_T2";
}
}
static void Main(string[] args)
{
string t = new Type1().method2_T1();
LogNow();
....
}
和当我调用LogNow()时获得的结果是:
StackTrace of method2_T1()
…
谢谢
这很简单:
var stackTrace = new StackTrace(true);
var traceToLog = stackTrace.ToString();
true
参数表示包含文件信息
Todd Sprang的答案与实际答案一样好,但是要注意,当您移动到RELEASE构建或使用async/await时,堆栈跟踪将以不可预测的方式变化。不要在编程上依赖于答案,因为当您将代码投入生产时,您可能会陷入困境。
如果您想知道一个特定函数的直接调用者,以Microsoft推荐的方式,使用[CallerMemberName]
、[CallerFilePath]
和[CallerLineNumber]
属性有一个有用的技巧。像这样标记可选参数;
public void LogWithCallerInfo(
string message,
[CallerMemberName] string memberName = "Caller",
[CallerFilePath] string sourceFilePath = "File",
[CallerLineNumber] int sourceLineNumber = 0)
{
WriteProgressMessage(..., memberName, sourceFilePath, sourceLineNumber);
}
LogWithCallerInfo("my message");
三个可选参数将被替换为相应的调用信息