cdb 在 Win32 getaddrinfo() 的 ISO C(不是 C++!)代码中看到“异常”

cdb sees "exception" in ISO C (not C++!) code from Win32 getaddrinfo()

提问人:Roland Mainz 提问时间:10/26/2023 最后编辑:Remy LebeauRoland Mainz 更新时间:10/26/2023 访问量:80

问:

在调试使用 Visual Studio 19 编译的多线程(1024 个工作线程)ISO C 应用程序时,我从“cdb”(WinDBG 的控制台版本)收到以下消息。

看起来我得到了一个“异常”,但代码是普通的 ISO C - 问题是是否

  1. 这是正确的吗?

  2. 我怎样才能捕捉到这个异常?或者,此异常是否在返回到我们的代码之前处理?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()

c 异常 winapi windbg

评论

1赞 Remy Lebeau 10/26/2023
getaddrinfo()失败时不会引发异常,而是返回错误代码。这很容易自己验证。
2赞 Retired Ninja 10/26/2023
第一次机会异常在 Win32 代码中并不少见。如果未处理,则将收到一个未处理的异常,如果不处理,该异常将终止程序。什么是首次机会例外?我假设有一个选项,您可以在 CDB 中忽略它们,就像在 Visual Studio 编译器中一样,我只是不知道它是什么。

答:

1赞 Clifford 10/26/2023 #1

这与 MSVC 的结构化异常处理扩展有关。它不同于 C++ 异常处理,适用于 C 和 C++/CLR 代码。

异步异常(硬件异常,如除以零的异常)可以由 SEH 捕获和处理 ()。我想即使你不启用SEH,调试器也会捕获它们,如果在调试器之外运行,进程就会终止。/EHa

在大多数情况下,最好修复错误,即为不应该发生的事情添加异常处理程序。