5 min read

C# DUMP 분석하기

보통 컴퓨터로 덤프를 남긴다고 하면 바로 디버깅용을 위해 만든다고 합니다. C++일 경우에는 pdb흔히 말하는 심볼파일과 소스코드만 있으면 되는 반면 C#으로 덤프로 분석을하는 경우는 생각지도 못하는게 필요합니다.

이는 C#의 닷넷 라이브러리가 필요하게됩니다. 일단 설명보다 직접 해보면서 진행해보겠습니다.

VC++을 C# console마법사로 프로젝트를 만든다음에 다음과 같은 코드를 쳐주시고 실행시켜주시기 바랍니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("hello");
            Console.WriteLine("asdas");
            Console.ReadLine();
        }
    }
}

위 코드는 출력하고 입력을 받는 하나의 프로그램입니다. 일단 이프로그램을 릴리즈모드로 컴파일 시켜봅시다.

이 상태에서 아무런 입력도 하지않는상태에서 작업관리자를 켜준후 방금 만든 프로세스의 오른쪽 클릭후 Create dump file을 클릭해줍니다. 그 후 테스트를 위해 프로젝트 폴더명을 꼭 변경해 주시기 바랍니다.

그러면 아래와 같은 화면이 출력이 됩니다. 이는 전체 덤프를 저장하는것인이며 이 경로로 DMP파일을 바탕하면에 옮겨 비주얼 스튜디오로 실행시켜 주시기바랍니다.

그러면 이와 같이 뜨게 됩니다. 이때 Microsoft symbol Servers를 꼭 체크해주시고 자기가 컴파일해서 실행파일이 만들어진곳에 경로를 추가시켜 주시기 바랍니다.

여기까지는 C++로 했을때와 동일합니다. 하지만 Debug with Managed Only를 눌르면 생각지도 못하는 소스코드를 요구하게 됩니다.

.

바로 __consolestream.cs 입니다. 우리는 이런 파일은 만들지않았는데 vs++는 왜 찾을까요?

이 소스코드는 사실 Console.Readline 함수안의 함수입니다.

여기서 해결방법은 크게 두가지가 있습니다. 하나는 해당 reshaper 플러그인을 사용한다. 또 다른 하나는 소스코드를 __consolestream.cs 받는다.

reshaper 플러그인은 유로라 후자의 방법을 선택하겠습니다. 자 그럼
__consolestream.cs 은 어디서 찾을수 있을까여?

사실 닷넷의 소스코드는 MS가 잘 공개하고 있고 관련 git이 있습니다. 바로 아래의 링크인데요.

링크 : https://github.com/Microsoft/referencesource

해당 깃주소를 clone을 한다음에 아까 __consolestream.cs을 찾는 창으로 가 해당 풀더를 클릭해줍니다. __consolestream.cs의 위치는 referencesource-master\mscorlib\system\io에 있습니다. 해당 폴더를 클릭해주기만 하면 짜잔..

소스코드를 볼수있게 되었습니다. 이제 콜스택으로가 main을 찾아봅시다. 왜냐하면 덤프할시점의 소스코드는 main에 있기 때문입니다.

짜잔 우리가 찾고싶던 위치가 떡하니 나오게 되었습니다.

이로써 MS가 닷넷의 소스코드를 오픈한 이유가 나오게됩니다. 한마디로 디버깅하라는 거입니다.

여기서 중요할점은 프로젝트의 소스코드 버전과 MS에서 받는 심볼(pdb)파일이 안 맞으면 안된다는 점입니다. pdb는 컴파일을 할때마다 바뀌게 됩니다. 고로 pdb파일과 소스코드는 하나로 보면됩니다.

다행히..MS가.4.5.1이후의 소스코드는 전부 다운로드 할수 있도록 해두었다는 점이죠. 링크는 다음과 같습니다.

https://referencesource.microsoft.com/download.html