You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从核心转储文件中获取WSAGetLastError()的返回值

程序崩溃排查:send()失败未保留错误码问题

测试过程中程序崩溃,原因是套接字写入时出现意外错误。遗憾的是,抛出的异常并未包含失败的直接原因——send()调用失败,但抛出异常时未保存WSAGetLastError()的返回值。

此次send操作发生在一个内部管道上:该管道由同一进程中监听localhost的套接字与另一个套接字连接创建,用于线程间通信。当时仅尝试发送一个字节以唤醒执行select()的另一个线程,因此出现错误十分反常。

由于崩溃发生在send失败后立即出现,且该线程在此期间不应有其他套接字操作,我认为错误代码应该存在于核心转储文件中。我对x86-64汇编的了解有限,想通过解析WSAGetLastError的实现来找到该错误代码的存储位置(是否有更简便的方法?)

已执行的分析步骤

  • 找到本地系统中ws2_32.dll内WSAGetLastError的地址(0x00012730),并从核心转储文件中获取了该DLL的基地址(0x7ffc95e50000)。将两者相加后,在Visual Studio中调试核心转储文件时查看了0x7FFC95E62730处的反汇编代码:
00007FFC95E62730 48 FF 25 01 35 03 00 jmp         qword ptr [__imp_GetLastError (07FFC95E95C38h)]  
00007FFC95E62737 CC                   int         3  
00007FFC95E62738 CC                   int         3  
00007FFC95E62739 CC                   int         3  
00007FFC95E6273A CC                   int         3  
00007FFC95E6273B CC                   int         3  
00007FFC95E6273C CC                   int         3  
00007FFC95E6273D CC                   int         3  
  • 查看*(void*)0x07FFC95E95C38的值为0x7FFC93DACD60,对应的反汇编代码为:
00007FFC93DACD60 65 48 8B 04 25 30 00 00 00 mov         rax,qword ptr gs:[30h]  
00007FFC93DACD69 8B 40 68             mov         eax,dword ptr [rax+68h]
00007FFC93DACD6C C3                   ret 

遇到的困惑

不清楚如何解析qword ptr gs:[30h]。WinDBG显示该线程的GS寄存器值为0x002b,但0x005b并非已映射地址。


内容的提问来源于stack exchange,提问作者Bwmat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:17:49