WinDbg - .kframes 명령어
k 명령어로 호출 스택을 출력하는데, 이상하게 255개의 프레임까지만 보여줍니다.
0:147> k
*** WARNING: Unable to verify checksum for Oracle.ManagedDataAccess.DLL
# Child-SP RetAddr Call Site
00 0000001f`20785fd0 00007fff`7a44cab7 clr!SecurityDeclarative::InvokeDeclarativeActions+0x5edbe
01 0000001f`20786100 00007fff`7a4256c5 clr!JIT_Security_Prolog_Framed+0x127
02 0000001f`20786280 00007fff`1c5e0f93 clr!JIT_Security_Prolog+0x45
03 0000001f`207862b0 00007fff`1c66b084 Oracle_ManagedDataAccess!Oracle.ManagedDataAccess.Client.OracleConnection.get_State+0x23
04 0000001f`207862f0 00007fff`1cbc00cd TestMod!TestClass.TestMethod+0x74
05 0000001f`20786340 00007fff`1c5e0fbd Oracle_ManagedDataAccess!Oracle.ManagedDataAccess.Client.OracleConnection.Close+0x4d
...[생략]...
fc 0000001f`2078cfa0 00007fff`1c66b084 Oracle_ManagedDataAccess!Oracle.ManagedDataAccess.Client.OracleConnection.get_State+0x4d
fd 0000001f`2078cfe0 00007fff`1cbc00cd TestMod!TestClass.TestMethod+0x74
fe 0000001f`2078d030 00007fff`1c5e0fbd Oracle_ManagedDataAccess!Oracle.ManagedDataAccess.Client.OracleConnection.Close+0x4d
ff 0000001f`2078d0f0 00007fff`1c66b084 Oracle_ManagedDataAccess!Oracle.ManagedDataAccess.Client.OracleConnection.get_State+0x4d
// 참고로, .NET CLR을 디버깅할 때 사용하는 clrstack 명령어는 모든 스택을 보여줍니다. (그래서 경우에 따라 완료되기까지 시간이 더 걸릴 수 있습니다.)
보는 바와 같이, 저 제약으로 인해 재귀가 발생한 최초 함수 호출로의 문맥 전환을 할 수 없게 되는데요, 검색해 보니까 기본값이 255로 설정돼 있어서입니다. ^^;
.kframes (Set Stack Length)
; https://learn.microsoft.com/en-us/windows-hardware/drivers/debuggercmds/-kframes--set-stack-length-
0:147> .kframes
Default stack trace depth is 0n256 frames
따라서 저런 경우에는 .kframes 명령어로 스택 프레임의 개수를 늘려주면 됩니다.
0:147> .kframes 10000
Default stack trace depth is 0n65536 frames
0:147> k
...[최대 10,000개의 스택 프레임 출력]...
유사한 제약이 Visual Studio에도 있는데요, Call Stack 창에서 보여주는 최대 frame의 개수가 기본적으로 5,000개로 설정돼 있고,
그것을 변경하려면 VSDebugEng_Impl_Engine.pkgdef 파일을 수정해야 합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]