提问人:Roland Mainz 提问时间:10/26/2023 最后编辑:Remy LebeauRoland Mainz 更新时间:10/26/2023 访问量:80
cdb 在 Win32 getaddrinfo() 的 ISO C(不是 C++!)代码中看到“异常”
cdb sees "exception" in ISO C (not C++!) code from Win32 getaddrinfo()
问:
在调试使用 Visual Studio 19 编译的多线程(1024 个工作线程)ISO C 应用程序时,我从“cdb”(WinDBG 的控制台版本)收到以下消息。
看起来我得到了一个“异常”,但代码是普通的 ISO C - 问题是是否
这是正确的吗?
我怎样才能捕捉到这个异常?或者,此异常是否在返回到我们的代码之前处理?
getaddrinfo()
(2328.2010): Unknown exception - code 00000005 (first chance)
Child-SP RetAddr Call Site 00000080 002fa3d0
00007ffe ee8204c0 KERNELBASE!RaiseException+0x69 00000080 002fa4b0
00007ffe ee820484 RPCRT4!RpcpRaiseException+0x34 00000080 002fa4e0
00007ffe ee8695e1 RPCRT4!RpcRaiseException+0x14 00000080 002fa510
00007ffe ee8cd562 RPCRT4!NdrSendReceive+0x41 00000080 002fa540
00007ffe ee8d05d0 RPCRT4!NdrpClientCall3+0x5d2 00000080 002fa8b0
00007ffe ec358cc1 RPCRT4!NdrClientCall3+0xf0 00000080 002fac40
00007ffe ec3589c3 DNSAPI!SyncResolverQueryRpc+0x171 00000080 002fae40
00007ffe ec35c327 DNSAPI!Rpc_ResolverQuery+0xc3 00000080 002faf10
00007ffe ec35bad6 DNSAPI!Query_PrivateExW+0x7a7 00000080 002fb740
00007ffe ec62b163 DNSAPI!DnsQueryEx+0x166 00000080 002fb9b0
00007ffe ec62af34 mswsock!SaBlob_Query+0xcb 00000080 002fba80
00007ffe ec62a60e mswsock!Rnr_DoDnsLookup+0x1ac 00000080 002fbb20
00007ffe ef44ba88 mswsock!Dns_NSPLookupServiceNext+0x1de
00000080 002fbf30 00007ffe ef44bc9c
WS2_32!NSPROVIDER::NSPLookupServiceNext+0x78 00000080 002fc000
00007ffe ef44bbbd WS2_32!NSQUERY::LookupServiceNext+0xa0
00000080 002fc080 00007ffe ef44bf7a WS2_32!WSALookupServiceNextW+0xdd
00000080 002fc0d0 00007ffe ef44c316 WS2_32!QueryDnsForFamily+0x1ae
00000080 002fca80 00007ffe ef4434da WS2_32!QueryDns+0x172
00000080 002fcb40 00007ffe ef445eac WS2_32!LookupAddressForName+0x122
00000080 002fcc50 00007ffe ef4437d5 WS2_32!GetAddrInfoW+0x38c
00000080 002fcdf0 00007ff6 a43b68cd WS2_32!getaddrinfo+0xc5
00007ff6 a439ca7c nfsd!nfs41_server_resolve(char * hostname =
0x00000080 002fd180 "derfwpc5131_ipv6", unsigned short port = 0x801,
struct __multi_addr4 * addrs = 0x00000080`002fd780)+0xed
我们尝试在普通的 ISO C 代码中使用,但得到一个例外。getaddrinfo()
问题是返回是否正常并带有错误返回代码,或者异常只是跳过返回并退出正在运行的线程?getaddrinfo()
答:
1赞
Clifford
10/26/2023
#1
这与 MSVC 的结构化异常处理扩展有关。它不同于 C++ 异常处理,适用于 C 和 C++/CLR 代码。
异步异常(硬件异常,如除以零的异常)可以由 SEH 捕获和处理 ()。我想即使你不启用SEH,调试器也会捕获它们,如果在调试器之外运行,进程就会终止。/EHa
在大多数情况下,最好修复错误,即为不应该发生的事情添加异常处理程序。
评论
getaddrinfo()
失败时不会引发异常,而是返回错误代码。这很容易自己验证。