如何从核心转储文件中获取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
相关产品推荐
相关产品推荐

