WinDbg를 사용하여 함수의 인수 및 반환 값을 디버거에 출력
WinDbg를 사용하여 함수의 인수 및 반환 값을 디버거에 출력하는 방법
WinDbg에서는 브레이크 포인트 히트시에 새로운 브레이크 포인트를 작성할 수 있습니다.
또, 함수의 리턴 어드레스에 브레이크 포인트를 설치하는 것으로, 함수로부터 복귀한 직후에 브레이크시킬 수 있습니다.
이 기능을 사용하여 C 언어 함수의 인수와 반환 값을 디버거에 출력해 보겠습니다.
디버깅 대상 코드
계승을 요구하는 프로그램(factorial.exe)입니다.
factorial.c#include <stdio.h>
// 階乗を求める
int factorial(int n)
{
return n > 0 ? n * factorial(n - 1) : 1;
};
int main()
{
int n = 6;
int m = factorial(n);
printf("%d!=%d\n", n, m);
return 0;
}
브레이크 포인트 설정 방식
factorial.exe의 factorial 함수에 아래와 같은 브레이크 포인트를 설정해, 히트시에 함수의 리턴 어드레스에 브레이크 포인트를 작성하도록 하고 있습니다.
첫 번째 인수의 값은 esp + 4이고 반환 값은 eax로 가져옵니다.
bp factorial!factorial "bp poi(esp) \" .printf /D \\\"[factorial]\\\\t%p\\\\t終了\\\\t%p\\\\n\\\", esp, eax;g\"; .printf /D \"[factorial]\\t%p\\t開始\\t%p\\n\", esp+4, poi(esp+4); g"
x64 빌드의 경우 rsp, ecx 등의 레지스터를 사용합니다.
bp factorial!factorial "bp poi(rsp) \" .printf /D \\\"[factorial]\\\\t%p\\\\t終了\\\\t%p\\\\n\\\", rsp, eax;g\"; .printf /D \"[factorial]\\t%p\\t開始\\t%p\\n\", rsp+8, ecx; g"
디버거 출력 결과
디버깅 대상 코드를 Visual Studio 2013에서 디버그 빌드하고 WinDbg에서 중단점을 설정하고 실행합니다.
CommandLine: "C:\Users\r\Documents\Visual Studio 2013\Projects\factorial\Debug\factorial.exe"
************* Symbol Path validation summary **************
Response Time (ms) Location
Deferred srv*c:\symbols*http://msdl.microsoft.com/downloads/symbols
Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/downloads/symbols
Executable search path is:
ModLoad: 01180000 0119c000 factorial.exe
ModLoad: 77090000 771fe000 ntdll.dll
ModLoad: 76e70000 76fb0000 C:\Windows\SysWOW64\KERNEL32.DLL
ModLoad: 75170000 75247000 C:\Windows\SysWOW64\KERNELBASE.dll
ModLoad: 77620000 777df000 C:\Windows\SysWOW64\MSVCR120D.dll
(c48.1a64): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=cb780000 edx=00000000 esi=7f29f000 edi=00000000
eip=77143bad esp=0046f428 ebp=0046f454 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
ntdll!LdrpDoDebuggerBreak+0x2b:
77143bad cc int 3
0:000> bp factorial!factorial "bp poi(esp) \" .printf /D \\\"[factorial]\\\\t%p\\\\t終了\\\\t%p\\\\n\\\", esp, eax;g\"; .printf /D \"[factorial]\\t%p\\t開始\\t%p\\n\", esp+4, poi(esp+4); g"
*** WARNING: Unable to verify checksum for factorial.exe
0:000> g
[factorial] 0046f77c 開始 00000006
[factorial] 0046f6a0 開始 00000005
breakpoint 2 redefined
[factorial] 0046f5c4 開始 00000004
breakpoint 2 redefined
[factorial] 0046f4e8 開始 00000003
breakpoint 2 redefined
[factorial] 0046f40c 開始 00000002
breakpoint 2 redefined
[factorial] 0046f330 開始 00000001
breakpoint 2 redefined
[factorial] 0046f254 開始 00000000
[factorial] 0046f254 終了 00000001
[factorial] 0046f330 終了 00000001
[factorial] 0046f40c 終了 00000002
[factorial] 0046f4e8 終了 00000006
[factorial] 0046f5c4 終了 00000018
[factorial] 0046f6a0 終了 00000078
[factorial] 0046f77c 終了 000002d0
eax=00000000 ebx=7718f820 ecx=00000000 edx=00000000 esi=00000000 edi=01191109
eip=770cc73c esp=0046f71c ebp=0046f7e8 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
ntdll!NtTerminateProcess+0xc:
770cc73c c20800 ret 8
factorial 함수의 인수 및 반환 값이 디버거에 출력되었습니다.
본 출력 결과는 아래와 같은 표로 정리할 수 있습니다.
Reference
이 문제에 관하여(WinDbg를 사용하여 함수의 인수 및 반환 값을 디버거에 출력), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ryo-pinus/items/9d811ce72560efddff8b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <stdio.h>
// 階乗を求める
int factorial(int n)
{
return n > 0 ? n * factorial(n - 1) : 1;
};
int main()
{
int n = 6;
int m = factorial(n);
printf("%d!=%d\n", n, m);
return 0;
}
bp factorial!factorial "bp poi(esp) \" .printf /D \\\"[factorial]\\\\t%p\\\\t終了\\\\t%p\\\\n\\\", esp, eax;g\"; .printf /D \"[factorial]\\t%p\\t開始\\t%p\\n\", esp+4, poi(esp+4); g"
bp factorial!factorial "bp poi(rsp) \" .printf /D \\\"[factorial]\\\\t%p\\\\t終了\\\\t%p\\\\n\\\", rsp, eax;g\"; .printf /D \"[factorial]\\t%p\\t開始\\t%p\\n\", rsp+8, ecx; g"
CommandLine: "C:\Users\r\Documents\Visual Studio 2013\Projects\factorial\Debug\factorial.exe"
************* Symbol Path validation summary **************
Response Time (ms) Location
Deferred srv*c:\symbols*http://msdl.microsoft.com/downloads/symbols
Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/downloads/symbols
Executable search path is:
ModLoad: 01180000 0119c000 factorial.exe
ModLoad: 77090000 771fe000 ntdll.dll
ModLoad: 76e70000 76fb0000 C:\Windows\SysWOW64\KERNEL32.DLL
ModLoad: 75170000 75247000 C:\Windows\SysWOW64\KERNELBASE.dll
ModLoad: 77620000 777df000 C:\Windows\SysWOW64\MSVCR120D.dll
(c48.1a64): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=cb780000 edx=00000000 esi=7f29f000 edi=00000000
eip=77143bad esp=0046f428 ebp=0046f454 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
ntdll!LdrpDoDebuggerBreak+0x2b:
77143bad cc int 3
0:000> bp factorial!factorial "bp poi(esp) \" .printf /D \\\"[factorial]\\\\t%p\\\\t終了\\\\t%p\\\\n\\\", esp, eax;g\"; .printf /D \"[factorial]\\t%p\\t開始\\t%p\\n\", esp+4, poi(esp+4); g"
*** WARNING: Unable to verify checksum for factorial.exe
0:000> g
[factorial] 0046f77c 開始 00000006
[factorial] 0046f6a0 開始 00000005
breakpoint 2 redefined
[factorial] 0046f5c4 開始 00000004
breakpoint 2 redefined
[factorial] 0046f4e8 開始 00000003
breakpoint 2 redefined
[factorial] 0046f40c 開始 00000002
breakpoint 2 redefined
[factorial] 0046f330 開始 00000001
breakpoint 2 redefined
[factorial] 0046f254 開始 00000000
[factorial] 0046f254 終了 00000001
[factorial] 0046f330 終了 00000001
[factorial] 0046f40c 終了 00000002
[factorial] 0046f4e8 終了 00000006
[factorial] 0046f5c4 終了 00000018
[factorial] 0046f6a0 終了 00000078
[factorial] 0046f77c 終了 000002d0
eax=00000000 ebx=7718f820 ecx=00000000 edx=00000000 esi=00000000 edi=01191109
eip=770cc73c esp=0046f71c ebp=0046f7e8 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
ntdll!NtTerminateProcess+0xc:
770cc73c c20800 ret 8
Reference
이 문제에 관하여(WinDbg를 사용하여 함수의 인수 및 반환 값을 디버거에 출력), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ryo-pinus/items/9d811ce72560efddff8b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)