Till now I haven't seen better debugger than MS WinDbg if you want to debug an executive file.
For long time already I use Vsual studio to build and debug my projects.
The advantage of using Visual Studio is that you can mix C and assembler files to create .exe files and debug in both source level and disassembly. You can use ml.exe or ml64.exe or HJWasm 32 or 64.
Here is an example of VS debug built with HJWasm x64:
WinMain proc FRAME uses rbx ymm6 ymm7 hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:UINT
00007FF70D6F1109 C5 FD 7F BC 24 A0 01 00 00 vmovdqa ymmword ptr [rsp+1A0h],ymm7
LOCAL baba:YMMWORD
LOCAL deda:YMMWORD
LOCAL wc:WNDCLASSEXA
LOCAL msg:MSG
LOCAL var:QWORD
LOCAL hwnd:HWND
;--- init the "shadow variable". Alternatively, one may set bit 0
;--- of OPTION WIN64, then this is done automatically.
lea rax,__ImageBase
00007FF70D6F1112 48 8D 05 E7 EE FF FF lea rax,[7FF70D6F0000h]
;lea r10,testloc
;lea r11,test1
;lea rax,testloc1
;lea r8,testloc2
;vmovdqa testloc1,ymm1
lea rax,deda
00007FF70D6F1119 48 8D 84 24 C0 00 00 00 lea rax,[deda]
vmovdqa deda,ymm2
00007FF70D6F1121 C5 FD 7F 94 24 C0 00 00 00 vmovdqa ymmword ptr [deda],ymm2
mov hInst, rcx
00007FF70D6F112A 48 89 8C 24 E0 01 00 00 mov qword ptr [hInst],rcx
mov wc.cbSize, SIZEOF WNDCLASSEXA
00007FF70D6F1132 C7 84 24 E0 00 00 00 50 00 00 00 mov dword ptr [wc],50h
mov wc.style, CS_HREDRAW or CS_VREDRAW
00007FF70D6F113D C7 84 24 E4 00 00 00 03 00 00 00 mov dword ptr [rsp+0E4h],3
lea rax, [WndProc]
00007FF70D6F1148 48 8D 05 CA FE FF FF lea rax,[WndProc (07FF70D6F1019h)]
mov wc.lpfnWndProc, rax
00007FF70D6F114F 48 89 84 24 E8 00 00 00 mov qword ptr [rsp+0E8h],rax
mov wc.cbClsExtra, 0
00007FF70D6F1157 C7 84 24 F0 00 00 00 00 00 00 00 mov dword ptr [rsp+0F0h],0
mov wc.cbWndExtra, 0
00007FF70D6F1162 C7 84 24 F4 00 00 00 00 00 00 00 mov dword ptr [rsp+0F4h],0
mov wc.hInstance, rcx
00007FF70D6F116D 48 89 8C 24 F8 00 00 00 mov qword ptr [rsp+0F8h],rcx
mov wc.hbrBackground, COLOR_WINDOW+1
00007FF70D6F1175 48 C7 84 24 10 01 00 00 06 00 00 00 mov qword ptr [rsp+110h],6
mov wc.lpszMenuName, NULL
00007FF70D6F1181 48 C7 84 24 18 01 00 00 00 00 00 00 mov qword ptr [rsp+118h],0
lea rax, [ClassName]
00007FF70D6F118D 48 8D 05 6C 3E 00 00 lea rax,[ClassName (07FF70D6F5000h)]
mov wc.lpszClassName, rax
00007FF70D6F1194 48 89 84 24 20 01 00 00 mov qword ptr [rsp+120h],rax
invoke LoadIconA, NULL, IDI_APPLICATION
00007FF70D6F119C 33 C9 xor ecx,ecx
00007FF70D6F119E 48 C7 C2 00 7F 00 00 mov rdx,7F00h
00007FF70D6F11A5 FF 15 05 5F 00 00 call qword ptr [__imp_LoadIconA (07FF70D6F70B0h)]
mov wc.hIcon, rax
00007FF70D6F11AB 48 89 84 24 00 01 00 00 mov qword ptr [rsp+100h],rax
mov wc.hIconSm, rax
00007FF70D6F11B3 48 89 84 24 28 01 00 00 mov qword ptr [rsp+128h],rax
invoke LoadCursor, NULL, IDC_ARROW
00007FF70D6F11BB 33 C9 xor ecx,ecx
00007FF70D6F11BD 48 C7 C2 00 7F 00 00 mov rdx,7F00h
00007FF70D6F11C4 FF 15 DE 5E 00 00 call qword ptr [__imp_LoadCursorA (07FF70D6F70A8h)]
mov wc.hCursor,rax
00007FF70D6F11CA 48 89 84 24 08 01 00 00 mov qword ptr [rsp+108h],rax
invoke RegisterClassEx, addr wc
00007FF70D6F11D2 48 8D 8C 24 E0 00 00 00 lea rcx,[wc]
00007FF70D6F11DA FF 15 A8 5E 00 00 call qword ptr [__imp_RegisterClassExA (07FF70D6F7088h)]
invoke CreateWindowEx, NULL, ADDR ClassName, ADDR AppName,\
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,\
CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL,\
hInst, NULL
00007FF70D6F11E0 33 C9 xor ecx,ecx
00007FF70D6F11E2 48 8D 15 17 3E 00 00 lea rdx,[ClassName (07FF70D6F5000h)]
00007FF70D6F11E9 4C 8D 05 1F 3E 00 00 lea r8,[AppName (07FF70D6F500Fh)]
00007FF70D6F11F0 41 B9 00 00 CF 00 mov r9d,0CF0000h
00007FF70D6F11F6 C7 44 24 20 00 00 00 80 mov dword ptr [rsp+20h],80000000h
00007FF70D6F11FE C7 44 24 28 00 00 00 80 mov dword ptr [rsp+28h],80000000h
00007FF70D6F1206 C7 44 24 30 00 00 00 80 mov dword ptr [rsp+30h],80000000h
00007FF70D6F120E C7 44 24 38 00 00 00 80 mov dword ptr [rsp+38h],80000000h
00007FF70D6F1216 48 C7 44 24 40 00 00 00 00 mov qword ptr [rsp+40h],0
00007FF70D6F121F 48 C7 44 24 48 00 00 00 00 mov qword ptr [rsp+48h],0
00007FF70D6F1228 48 8B 84 24 E0 01 00 00 mov rax,qword ptr [hInst]
00007FF70D6F1230 48 89 44 24 50 mov qword ptr [rsp+50h],rax
00007FF70D6F1235 48 C7 44 24 58 00 00 00 00 mov qword ptr [rsp+58h],0
00007FF70D6F123E FF 15 4C 5E 00 00 call qword ptr [__imp_CreateWindowExA (07FF70D6F7090h)]
mov hwnd,rax
00007FF70D6F1244 48 89 84 24 68 01 00 00 mov qword ptr [hwnd],rax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
00007FF70D6F124C 48 8B 8C 24 68 01 00 00 mov rcx,qword ptr [hwnd]
00007FF70D6F1254 BA 01 00 00 00 mov edx,1
00007FF70D6F1259 FF 15 39 5E 00 00 call qword ptr [__imp_ShowWindow (07FF70D6F7098h)]
invoke UpdateWindow, hwnd
00007FF70D6F125F 48 8B 8C 24 68 01 00 00 mov rcx,qword ptr [hwnd]
00007FF70D6F1267 FF 15 33 5E 00 00 call qword ptr [__imp_UpdateWindow (07FF70D6F70A0h)]
.for(::)
invoke GetMessage, ADDR msg, NULL, 0, 0
00007FF70D6F126D 48 8D 8C 24 30 01 00 00 lea rcx,[msg]
00007FF70D6F1275 33 D2 xor edx,edx
00007FF70D6F1277 45 33 C0 xor r8d,r8d
00007FF70D6F127A 45 33 C9 xor r9d,r9d
00007FF70D6F127D FF 15 DD 5D 00 00 call qword ptr [__imp_GetMessageA (07FF70D6F7060h)]
.break .if (!eax)
00007FF70D6F1283 85 C0 test eax,eax
00007FF70D6F1285 74 20 je WinMain+1B4h (07FF70D6F12A7h)
invoke TranslateMessage, ADDR msg
00007FF70D6F1287 48 8D 8C 24 30 01 00 00 lea rcx,[msg]
00007FF70D6F128F FF 15 D3 5D 00 00 call qword ptr [__imp_TranslateMessage (07FF70D6F7068h)]
invoke DispatchMessage, ADDR msg
00007FF70D6F1295 48 8D 8C 24 30 01 00 00 lea rcx,[msg]
00007FF70D6F129D FF 15 CD 5D 00 00 call qword ptr [__imp_DispatchMessageA (07FF70D6F7070h)]
xor eax,eax
00007FF70D6F12A3 33 C0 xor eax,eax
.endfor
00007FF70D6F12A5 EB C6 jmp WinMain+17Ah (07FF70D6F126Dh)
mov rax, msg.wParam
00007FF70D6F12A7 48 8B 84 24 40 01 00 00 mov rax,qword ptr [rsp+140h]
ret
00007FF70D6F12AF C5 FD 6F B4 24 80 01 00 00 vmovdqa ymm6,ymmword ptr [rsp+180h]
00007FF70D6F12B8 C5 FD 6F BC 24 A0 01 00 00 vmovdqa ymm7,ymmword ptr [rsp+1A0h]
00007FF70D6F12C1 48 81 C4 D0 01 00 00 add rsp,1D0h
00007FF70D6F12C8 5B pop rbx
00007FF70D6F12C9 C3 ret
WinMain endp