どのように呼び出し機能を積み重ねるか? -- c# フィールド と logging フィールド と stack-trace フィールド 関連 問題

How to I StackTrace the calling function?












0
vote

問題

日本語
<事前> <コード> static void WriteLog(String FullPath, String Log) { try { if (File.Exists(FullPath)) { FileInfo Fi = new FileInfo(FullPath); if (Fi.Length > MaxFileSize * 1024) { if (File.Exists(FullPath + ".Old")) { File.Delete(FullPath + ".Old"); } File.Move(FullPath, FullPath + ".Old"); } } string currentFile = System.IO.Path.GetFileName(new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName()); int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber(); File.AppendAllText(@FullPath, "[ " + MyTime.Now.ToString("dd/MM/yy HH:mm:ss") + " ] " + currentFile + "," + currentLine + "," + Log.Replace(" ", " ") + " "); } catch (Exception ex) { utilities.Log(ex.ToString()); } }

こんにちは、私は私のプログラムにロギングユーティリティを書いています。ログの一部では、CurrentFileの名前と現在の行番号をSTACKTRACEを使用してプログラム実行に表示します。ただし、次のコードの行はログutiltiyのcurrentfileと行を返します。

<事前> <コード> string currentFile = System.IO.Path.GetFileName(new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName()); int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber();

StackTraceを発信関数の現在のファイルと行番号を返す方法は?

英語
 static void WriteLog(String FullPath, String Log)     {         try         {             if (File.Exists(FullPath))             {                 FileInfo Fi = new FileInfo(FullPath);                 if (Fi.Length > MaxFileSize * 1024)                 {                     if (File.Exists(FullPath + ".Old"))                     {                         File.Delete(FullPath + ".Old");                     }                     File.Move(FullPath, FullPath + ".Old");                 }             }             string currentFile = System.IO.Path.GetFileName(new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName());             int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber();             File.AppendAllText(@FullPath, "[ " + MyTime.Now.ToString("dd/MM/yy HH:mm:ss") + " ] " + currentFile + "," + currentLine + "," + Log.Replace("  ", "                        ") + "  ");         }         catch (Exception ex)         {             utilities.Log(ex.ToString());         }     } 

Hi, I'm writing a Logging utility in my program. Part of the log, I would like to show the currentFile name and the Current Line number in the program execution using stacktrace. However, Then following line of codes would return the log utiltiy's currentfile and line.

string currentFile = System.IO.Path.GetFileName(new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName()); int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber(); 

How do I make the stacktrace return the calling function's Current File and Line number?

</div
        

回答リスト

2
 
vote
vote
ベストアンサー
 

現在のものの前にフレームを取得する必要があるでしょう。

<事前> <コード> jQuery(function(){ var max = 3; var cat1_checkboxes = jQuery('input.cat1[type="checkbox"]'); var cat2_checkboxes = jQuery('input.cat2[type="checkbox"]'); var cat3_checkboxes = jQuery('input.cat3[type="checkbox"]'); cat1_checkboxes.change(function(){ var current = cat1_checkboxes.filter(':checked').length; checkboxes.filter(':not(:checked)').prop('disabled', current >= max); }); cat2_checkboxes.change(function(){ var current = cat2_checkboxes.filter(':checked').length; checkboxes.filter(':not(:checked)').prop('disabled', current >= max); }); cat3_checkboxes.change(function(){ var current = cat3_checkboxes.filter(':checked').length; checkboxes.filter(':not(:checked)').prop('disabled', current >= max); }); }); 3
 

You would need to get the frame before the current one:

var previousFrame = new System.Diagnostics.StackTrace(true).GetFrame(1); 
</div
 
 
3
 
vote
呼び出し元情報属性を使用して、メソッドのプロパティでファイル名、メンバー/メソッド名、および行番号を取得できます。 <事前> <コード> public void TraceMessage(string message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0){ Trace.WriteLine("message: " + message); Trace.WriteLine("member name: " + memberName); Trace.WriteLine("source file path: " + sourceFilePath); Trace.WriteLine("source line number: " + sourceLineNumber); }

アセンブリのロードのデバッグシンボルがない場合、この情報は利用できない場合があります。 (あなたの.dllファイルのそれぞれの.pdbファイルのマッチング)

 

By using the Caller Info attributes on your method properties, you can get the file name, member/method name, and line number.

public void TraceMessage(string message,         [CallerMemberName] string memberName = "",         [CallerFilePath] string sourceFilePath = "",         [CallerLineNumber] int sourceLineNumber = 0){     Trace.WriteLine("message: " + message);     Trace.WriteLine("member name: " + memberName);     Trace.WriteLine("source file path: " + sourceFilePath);     Trace.WriteLine("source line number: " + sourceLineNumber); } 

Note that this information might not be available if you do not have the debug symbols for your assembly loaded. (matching .pdb file for each of your .dll files)

</div
 
 
   
   

関連する質問

30  OCAMLでスタックトレースを取得するにはどうすればよいですか。  ( How do i get a stack trace in ocaml ) 
目的のCAML言語は、正しく尋ねるとスタックトレースのみを作成します - ByteCodeとネイティブコードの両方の要件は何ですか? ...

7  Dotnetスタックトレースの "1行目"  ( Line 0 in dotnet stack trace ) 
スタックトレースの上部は次のように似ていたエラーレポートを得ました。 <事前> <コード> System.NullReferenceException: &lt...> at MyApplication.MyType.SomeMethod(String arg...

1  クラッシュされた混合モードEXE / DLLからフルスタックトレースを取得する方法  ( How to get a full stacktrace from a crashed mixed mode exe dll ) 
C ++ / CLRにアプリケーションを書きました。ネイティブのlib / dllを使用します。まれな場合は、このネイティブDLLをインサイダーにクラッシュします。それから私はスタックトレースを取得しますが、管理された部分までのみ、内側のネイティブ部分は除外...

0  主な機能がスタックの観点から他の機能と異なるのはなぜですか  ( Why does main function differ from other function from stack point of view ) 
GDBを使用することを勉強しています、そして私はほとんど混乱しませんでした。これが私のコードです: <事前> <コード> #include <stdio.h> #include <stdlib.h> #include <string.h> void g(ch...

211  C ++ Display Stack Trace on:  ( C display stack trace on exception ) 
例外がスローされた場合、スタックトレースをユーザーに報告する方法があります。これを行うための最良の方法は何ですか?それは大量の追加コードを取りますか? 質問に答えるために: 可能であれば携帯可能であることをお願いします。私は情報がポップアップしたいので、ユーザ...

2  コールスタックを変更します  ( Modifying the call stack ) 
C ++でコールスタックを変更することは可能ですか? (私はこれが恐ろしい考えであり、本当に疑問に思っています----私は実際にこれを行っていることを計画していない) 例えば: <事前> <コード> void foo(){ other(); cout...

73  ログで積み重ねを切り捨てるのをやめるにはどうすればよいですか  ( How do i stop stacktraces truncating in logs ) 
Javaログではたくさんの時間がかかります。 <事前> <コード> Caused by: java.sql.BatchUpdateException: failed batch at org.hsqldb.jdbc.jdbcStatement.exe...

3  Reclling Recursiveインライン関数でG ++ / GCCの効果がありますか?  ( How effective is g gcc at unrolling recursive inline functions ) 
私は再帰を求めたいと思う尾再帰的なインライン機能を再発しました。はい、私は g++ -O3 -funroll-loops を使用しています。 <事前> <コード> inline void recurse_fun(..., unsigned depth = 0,...

344  実行中のPythonアプリケーションからスタックトレースを表示します  ( Showing the stack trace from a running python application ) 
私は時々立ち往生しているこのPythonアプリケーションを持っています、そして私はどこでどこで見つけることができません。 実行されている正確なコードを表示するためにPythonインタプリタをシグリックする方法はありますか? いくつかのオンザフライスタックトレ...

37  Flash / ActionScript 3.0のStackTrace  ( Stacktrace in flash actionscript 3 0 ) 
コードのどの関数でスタックトレースを見たいので、このように次のようにして、スタックトレースを印刷します。 <事前> <コード> public function PrintStackTrace() { try { throw new Er...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有