앱 개발 및 유지 보수에 있어 디버깅 또한 많은 노력과 시간이 필요 합니다.
디버깅은 통합 개발환경(Visual Studio,Android Studio,Xcode등)에서 지원 하며,
또한 필요한 부분에 개발자가 로그(log)를 추가하여 분석을 진행할 수 있습니다.
로그를 통한 디버깅 방법 및 릴리즈모드에서 로그를 파일로 저장하는 방법을
간단한 앱을 통해서 확인해 보도록 하겠습니다.
프로젝트 위치는 아래와 같습니다.
GitHub : https://github.com/cocoknight/myblog/tree/main/C%23/LogHandler/HelloLog
HelloLog실행 화면
실행 후, "로그 텍스트박스","로그 메시지박스"버튼을 눌렀을 때의 결과가 바로 위 화면
입니다. 해당 부분은 특별히 설명을 하지는 않겠습니다.
로그 콘솔 출력(디버그모드 실행)
현재 프로젝트는 Visual Studio Community 2019에서 제작되었습니다.
디버그모드 실행
Github에서 프로젝트를 다운받으 신후,
HelloLog.sln파일을 더블 클릭 합니다.
통환환경(Visual Studio Community)에서 다음과 같이 빌드 모드를 설정 합니다.
반드시 실행 모드를 "Debug"로 설정하셔야 합니다.
설정 후, "F5"키 또는 "디버그메뉴 - 디버깅시작"을 선택해서 프로젝트를 실행 합니다.
화면에서 "로그 콘솔 출력(디버그모드 실행)"을 선택하면 아래 코드를 실행 합니다.
현재 디버그 모드로 실행중이기 때문에, 아래에 기술된 3가지 방법중 어떤 것을 사용해도
콘솔창에 메세지를 출력 할 수 있습니다.
문자열 출력 시 {0},{1}의 인덱스는 ","이후에 나오는 문자열의 순서와 matching이 됩니다.
_s_testTime이 인덱스 0, _helloString이 인덱스 1이 됩니다.
private void btnConsole_Click(object sender, EventArgs e)
{
_testTime = System.DateTime.Now;
_s_testTime = string.Format("{0:hh:mm:ss tt}", _testTime);
Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Console.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
}
콘솔의 출력 결과는 다음과 같습니다.
통홥환경(Visual Studio Community)의 콘솔창에 로그 메세지 출력을 확인할 수 있습니다.
앱이 배포될 때는 릴리즈모드로 배포 됩니다. 따라서 해당모드에서 프로그램이 실행 될때
로그를 확보하고 싶은 경우, 사용되는 방법입니다.
private void btnDebug_Click(object sender, EventArgs e)
{
this.turnon_log_dump();
_s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Thread.Sleep(1000);
_s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Thread.Sleep(1000);
_s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Thread.Sleep(1000);
_s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
//TOAN : 12/14/2022. Debug Mode에서 Debug와 Trace출력 테스트...
Debug.WriteLine(string.Format("Debug 모드에서 , Debug.Write해도 파일로 저장되니???"));
Debug.WriteLine(string.Format("Debug 모드에서 , Debug.Write해도 파일로 저장되니/한번만 더 확인해줘???"));
Trace.WriteLine(string.Format("Debug 배포모드에서 , Trace.Write해도 파일로 저장되니???"));
Trace.WriteLine(string.Format("Debug 배포모드에서 , Trace.Write해도 파일로 저장되니/한번만 더 확인해줘???"));
}
private void btnRelease_Click(object sender, EventArgs e)
{
//step1 : setup about TextWriterTraceListener
this.turnon_log_dump();
//step2 : write a log
//step1이 완료된 후, Trace.WriteLine은 콘솔이 아닌 step1에서 지정한
//파일에 내용이 저장 된다.
_s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
//Debug.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Thread.Sleep(1000);
_s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Thread.Sleep(1000);
_s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Thread.Sleep(1000);
_s_testTime = string.Format("{0:hh:mm:ss tt}", System.DateTime.Now);
Trace.WriteLine(string.Format("{0}:{1},", _s_testTime, _helloString));
Debug.WriteLine(string.Format("Debug 모드에서 , Debug.Write해도 파일로 저장되니???"));
Debug.WriteLine(string.Format("Debug 모드에서 , Debug.Write해도 파일로 저장되니/한번만 더 확인해줘???"));
Trace.WriteLine(string.Format("Debug 배포모드에서 , Trace.Write해도 파일로 저장되니???"));
Trace.WriteLine(string.Format("Debug 배포모드에서 , Trace.Write해도 파일로 저장되니/한번만 더 확인해줘???"));
}
위 코드에서 turnon_log_dump메서드의 내용을 확인해 보겠습니다.
public void turnon_log_dump()
{
try
{
//Log Fild이 저장될 경로 지정
//아래와 같이 지정하면, 앱의 실행파일이 위치한 경로에
//logdump.txt이름으로 로그가 저장 된다.
string ExportFilePath = Path.GetDirectoryName(Application.ExecutablePath);
string app_verification_log = ExportFilePath + @"\logdump.txt";
//TextWriterTraceListener생성.
//생성할 때 생성자의 인자로 로그 파일 경로 지정
TextWriterTraceListener cListener = new TextWriterTraceListener(System.IO.File.Open(
app_verification_log, FileMode.Append));
//Trace의 리스너로 등록
Trace.Listeners.Add(cListener);
Trace.AutoFlush = true;
}catch(Exception ex)
{
Debug.WriteLine(string.Format("Full Stacktrace: {0}", ex.ToString()));
}
}
turnon_log_dump메서드는 크게 로그파일 이름 및 경로를 지정하고,TextWriteListener를
생성한 후 Trace에 생성한 Listener를 등록하는 것이다.
이렇게 등록된 후 부터는 로그 출력이 파일로 저장 됩니다.
저장된 내용은 아래와 같습니다.
File : logdump.txt(C:\myworld\VSProject\LogHandler\HelloLog\bin\Debug)
08:06:08 오후:Hello C# World!,
08:06:09 오후:Hello C# World!,
08:06:10 오후:Hello C# World!,
08:06:11 오후:Hello C# World!,
Debug 모드에서 , Debug.Write해도 파일로 저장되니???
Debug 모드에서 , Debug.Write해도 파일로 저장되니/한번만 더 확인해줘???
Debug 배포모드에서 , Trace.Write해도 파일로 저장되니???
Debug 배포모드에서 , Trace.Write해도 파일로 저장되니/한번만 더 확인해줘???
중요한 것은 디버그 모드로 빌드했을 경우는 Debug.WriteLine, Trace.WriteLine
이 결과가 모두 파일로 저장 된다는 것이다.
릴리즈모드 로그 저장 위치
저장된 내용은 아래와 같습니다.
File : logdump.txt (C:\myworld\VSProject\LogHandler\HelloLog\bin\Release)
08:09:20 오후:Hello C# World!,
08:09:21 오후:Hello C# World!,
08:09:22 오후:Hello C# World!,
08:09:23 오후:Hello C# World!,
Relase 배포모드에서 , Trace.Write해도 파일로 저장되니???
Relase 배포모드에서 , Trace.Write해도 파일로 저장되니/한번만 더 확인해줘???
릴리즈모드로 빌드했을 때는 btnRelease_Click함수 안에 명시적으로 Debug.WriteLine
코드가 있음에도 해당 코드는 실행되지 못하고, 따라서 로그파일안에도 Debug.WriteLine
의 로그는 저장되어 있지 않다.