質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

1回答

2486閲覧

Azureの診断モニタにエラーログのソース行数を表示する方法

tamogi

総合スコア72

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

0グッド

0クリップ

投稿2016/01/14 13:57

Windows Azure SDKの1.5のサポートが切れたため、最新の2.8に
アップグレードしました。

処理の実行中に例外が発生した場合、診断モニタからWADLogsTableへStackTraceを出力しているのですが、2.8から出力されるログに、ソースコードの行数が出なくなってしまい、エラーが発生した箇所の特定ができなくなってしまいました。

セキュリティ上、ソースを貼ることができないため、以下にかなり簡略化した
ソースを記述します。
手元に本物のソースがないので、記憶を頼りに書いています。
記述が間違っていたら適宜、脳内で修正してくださいm(_ _)m

C#

1//TestClass.cs 2class TestClass 3{ 4 static void Main(string[] args) 5 { 6 try{ 7 // SubClassのAddDataを実行する 8 Process proc = new SubClass(); 9 proc.addData(); 10 11 } catch(Exception e){ 12 //エラーのStackTraceを出力 13 Trace.TraceError(e.StackTrace); //仮に、ここがTestClass.csの100行目だったとする 14 } 15 16 } 17} 18 19//SubClass.cs 20class SubClass 21{ 22 public void addData() 23 { 24 //ここがSubClass.csの20行目とし、例外が発生したとする 25 } 26}

上記のソースの事象が発生すると、以下のようにログが出力されてしまいます。

text

1(省略) 2at SubClass2.addData() 3at TestClass.main():100

これを「addData():20」というようにエラーの最初の発生箇所を出力したいのですが、どうすればよいでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

System.Diagnostics.Trace.TraceError(String message)よりアプリケーション トレースログを出力しているかと思いますが、こちらについては引数の文字列がそのままログとして出力されます。
ですので、記述いただいたソース中のe.StackTraceで出力される文字列がそのままトレースされているはずです。
実際の実行環境で上記のソースのe.StackTrace部分をコンソール等で出力した場合、Azure Strageへトレースされたログと差分はございますでしょうか。

また、少し調査してみましたところ、Azure SDK for .NETのv1.5、v2.8で.NET Framework のサポートバージョンが違うという記事を見つけました。

v1.5:3.5 SP1、4.0
v2.8:4.0、4.5、4.5.1、4.5.2系、4.6系

https://msdn.microsoft.com/ja-jp/library/dn479282.aspx

Azure SDK for .NETのバージョンアップの際に、.NET Frameworkのバージョンを上げたなどはございませんでしょうか。
もしそうでしたら、こちらの変更による影響も考えられるかもしれません。
(記述頂いたコードにて.NET Frameworkの各バージョンのStackTraceの内容を見ましたが、私の環境ではStackFrameごとに行数が表示されておりましたが...)

アプリの規模感が不明ですので、実現可能かどうかはわかりませんが、記述いただいたソースを以下のような形で変更頂けると各StackFrame毎の行数の出力等は行えるようになるかと思いますので、どうしても必要だということでしたらお試し下さい。

C#

1//TestClass.cs 2class TestClass 3{ 4 static void Main(string[] args) 5 { 6 try{ 7 // SubClassのAddDataを実行する 8 SubClass proc = new SubClass(); 9 proc.addData(); 10 11 } catch(Exception e){ 12 //エラーのStackTraceを出力 13 Trace.TraceError(ShowStackTrace(e)); 14 } 15 } 16 17 //StackTraceより各StackFrameの詳細を取得 18 static String ShowStackTrace(Exception e) 19 { 20 StringBuilder traceLog = new StringBuilder(); 21 StackTrace trace = new StackTrace(e, true); 22 foreach(var frame in trace.GetFrames) 23 { 24 traceLog.AppendLine("File Name : " + frame.GetFileName()); 25 traceLog.AppendLine("Class Name : " + frame.GetMethod().ReflectedType.Name); 26 traceLog.AppendLine("Method Name" + frame.GetMethod()); 27 traceLog.AppendLine("Line Number : " + frame.GetFileLineNumber()); 28 traceLog.AppendLine("======================================================="); 29 } 30 31 return traceLog.ToString(); 32 } 33} 34 35//SubClass.cs 36class SubClass 37{ 38 public void addData() 39 { 40 //ここがSubClass.csの20行目とし、例外が発生したとする 41 } 42}

投稿2016/06/19 12:54

y-sakamoto

総合スコア194

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamogi

2016/06/24 16:06

先日に引き続き、大変詳しい回答ありがとうございます。 >実際の実行環境で上記のソースのe.StackTrace部分をコンソール等で出力した場合、Azure Strageへトレースされたログと差分はございますでしょうか。 「実際の実行環境」というのは、Azureにデプロイしたものをリモートデバッグする ということでしょうか? まだ試していないです・・・。 ローカルのエミュレータでは行数までちゃんと表示されます。 >.NET Frameworkのバージョンを上げたなどはございませんでしょうか。 当時最新だった4.5.2(か、4.5のいづれか)に上げました。 提示いただきましたソースを追加してみたところ、確かに行数は出力できたので、とりあえず数日様子を見てみたいと思います。 ちなみに、 foreach(var frame in trace.GetFrames) は、 foreach(var frame in trace.GetFrames()) と記述しないとコンパイルエラーとなりました。
y-sakamoto

2016/06/26 13:32

>「実際の実行環境」というのは、Azureにデプロイしたものをリモートデバッグする ということでしょうか? 記載頂いた内容でも構いませんし、デプロイしたものをデバッグするが難しいのでしたら、Azure StorageのTableサービスあたりへStack Traceを流して確認するなどでもいいかと思います。 私の環境下でも行数がきちんと表示されていたので、質問者様の本番環境で出力されるStack Traceがおかしいのか、TraceErrorメソッドを通したことによっておかしくなったのかを切り分ける必要があるかと思ったためです。 >ちなみに、 foreach(var frame in trace.GetFrames) は、 foreach(var frame in trace.GetFrames()) と記述しないとコンパイルエラーとなりました。 失礼致しました。 一部ソースを後から記述した為、ビルド確認がされていない部分がございました。 以後気をつけようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問