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();
}
}
}
위 코드는 출력하고 입력을 받는 하나의 프로그램입니다. 일단 이프로그램을 릴리즈모드로 컴파일 시켜봅시다.
![](https://www.kudryavka.me/content/images/wordpress/2019/03/input-wait.jpg)
이 상태에서 아무런 입력도 하지않는상태에서 작업관리자를 켜준후 방금 만든 프로세스의 오른쪽 클릭후 Create dump file을 클릭해줍니다. 그 후 테스트를 위해 프로젝트 폴더명을 꼭 변경해 주시기 바랍니다.
![](https://www.kudryavka.me/content/images/wordpress/2019/03/create-dump-file.jpg)
![](https://www.kudryavka.me/content/images/wordpress/2019/03/image.png)
그러면 아래와 같은 화면이 출력이 됩니다. 이는 전체 덤프를 저장하는것인이며 이 경로로 DMP파일을 바탕하면에 옮겨 비주얼 스튜디오로 실행시켜 주시기바랍니다.
![](https://www.kudryavka.me/content/images/wordpress/2019/03/image-2.png)
그러면 이와 같이 뜨게 됩니다. 이때 Microsoft symbol Servers를 꼭 체크해주시고 자기가 컴파일해서 실행파일이 만들어진곳에 경로를 추가시켜 주시기 바랍니다.
여기까지는 C++로 했을때와 동일합니다. 하지만 Debug with Managed Only를 눌르면 생각지도 못하는 소스코드를 요구하게 됩니다.
![](https://www.kudryavka.me/content/images/wordpress/2019/03/image-3.png)
바로 __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에 있습니다. 해당 폴더를 클릭해주기만 하면 짜잔..
![](https://www.kudryavka.me/content/images/wordpress/2019/03/image-4.png)
소스코드를 볼수있게 되었습니다. 이제 콜스택으로가 main을 찾아봅시다. 왜냐하면 덤프할시점의 소스코드는 main에 있기 때문입니다.
![](https://www.kudryavka.me/content/images/wordpress/2019/03/image-5.png)
짜잔 우리가 찾고싶던 위치가 떡하니 나오게 되었습니다.
이로써 MS가 닷넷의 소스코드를 오픈한 이유가 나오게됩니다. 한마디로 디버깅하라는 거입니다.
여기서 중요할점은 프로젝트의 소스코드 버전과 MS에서 받는 심볼(pdb)파일이 안 맞으면 안된다는 점입니다. pdb는 컴파일을 할때마다 바뀌게 됩니다. 고로 pdb파일과 소스코드는 하나로 보면됩니다.
다행히..MS가.4.5.1이후의 소스코드는 전부 다운로드 할수 있도록 해두었다는 점이죠. 링크는 다음과 같습니다.