我有一个Windows 7电脑,系统是windows/amd64。
我正在使用go1.4从源代码构建Go。
我使用的是56d6b87的提交。
我正在运行make.bat命令。
你期望看到什么?
我期望make.bat命令能够成功完成。
你看到了什么?
make.bat从未完成。它挂起,例如,像这样:
c:\Users\alexb\dev\go\src>make
Building Go cmd/dist using c:\users\alexb\dev\\go1.4
Building Go toolchain1 using c:\users\alexb\dev\\go1.4.
Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.
Building Go toolchain2 using go_bootstrap and Go toolchain1.
Building Go toolchain3 using go_bootstrap and Go toolchain2.
我使用了process explorer https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer来检查进程树,这就是我看到的:
我还使用了WinDbg来附加到go_bootstrap.exe(pid 9788)并打印其所有线程的堆栈。这就是我看到的:
0:019> !uniqstack
Processing 20 threads, please wait
. 0 Id: 263c.23d8 Suspend: 1 Teb: 000007ff`fffde000 Unfrozen
Start: go_bootstrap+0x648e0 (00000000`004648e0)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`0022fae8 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`0022faf0 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`0022fb90 00000000`00b37be0 go_bootstrap+0x6494e
00000000`0022fb98 00000000`004270d3 go_bootstrap+0x737be0
00000000`0022fba0 00000000`00000000 go_bootstrap+0x270d3
. 1 Id: 263c.314c Suspend: 1 Teb: 000007ff`fffdc000 Unfrozen
Start: tmmon64+0x8adac (00000000`7478adac)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`0302fcb8 000007fe`fcc71430 ntdll!ZwWaitForMultipleObjects+0xa
00000000`0302fcc0 00000000`76df06c0 KERNELBASE!GetCurrentProcess+0x40
00000000`0302fdc0 00000000`747aeed4 kernel32!WaitForMultipleObjects+0xb0
00000000`0302fe50 00000000`7478ad07 tmmon64+0xaeed4
00000000`0302ff00 00000000`7478aeae tmmon64+0x8ad07
00000000`0302ff30 00000000`76df59cd tmmon64+0x8aeae
00000000`0302ff60 00000000`76f2a561 kernel32!BaseThreadInitThunk+0xd
00000000`0302ff90 00000000`00000000 ntdll!RtlUserThreadStart+0x21
. 2 Id: 263c.2d5c Suspend: 1 Teb: 000007ff`fffda000 Unfrozen
Start: ntdll!RtlDestroyHandleTable+0x270 (00000000`76f1f6f0)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`0322fcc8 00000000`76f1ed15 ntdll!ZwWaitForWorkViaWorkerFactory+0xa
00000000`0322fcd0 00000000`76df59cd ntdll!RtlValidateHeap+0x155
00000000`0322ff60 00000000`76f2a561 kernel32!BaseThreadInitThunk+0xd
00000000`0322ff90 00000000`00000000 ntdll!RtlUserThreadStart+0x21
. 3 Id: 263c.e74 Suspend: 1 Teb: 000007ff`fffd6000 Unfrozen
Start: ntdll!TpIsTimerSet+0x8b0 (00000000`76f1a280)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`0342fcb8 00000000`76f1a3c7 ntdll!ZwWaitForMultipleObjects+0xa
00000000`0342fcc0 00000000`76df59cd ntdll!TpIsTimerSet+0x9f7
00000000`0342ff60 00000000`76f2a561 kernel32!BaseThreadInitThunk+0xd
00000000`0342ff90 00000000`00000000 ntdll!RtlUserThreadStart+0x21
. 4 Id: 263c.196c Suspend: 1 Teb: 000007ff`fffd4000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`28e5eb68 00000000`76f48f58 ntdll!ZwWaitForSingleObject+0xa
00000000`28e5eb70 00000000`76f48e54 ntdll!RtlDeNormalizeProcessParams+0x5a8
00000000`28e5ec20 000007fe`fa3b7f0b ntdll!RtlDeNormalizeProcessParams+0x4a4
00000000`28e5ec50 000007fe`fa3b8504 TmUmEvt64+0x17f0b
00000000`28e5eeb0 000007fe`fa3b8c96 TmUmEvt64+0x18504
00000000`28e5ef10 000007fe`fa4565ca TmUmEvt64+0x18c96
00000000`28e5efa0 000007fe`fa455f8e TmUmEvt64+0xb65ca
00000000`28e5f000 000007fe`fa410686 TmUmEvt64+0xb5f8e
00000000`28e5f150 000007fe`fa439730 TmUmEvt64+0x70686
00000000`28e5f260 00000000`7472f146 TmUmEvt64+0x99730
00000000`28e5f4a0 00000000`747e2d7d tmmon64+0x2f146
00000000`28e5f580 00000000`747e29f4 tmmon64+0xe2d7d
00000000`28e5f640 00000000`74733748 tmmon64+0xe29f4
00000000`28e5f6b0 000007fe`fcc77c3f tmmon64+0x33748
00000000`28e5f780 00000000`0046494e KERNELBASE!ResumeThread+0xf
00000000`28e5f7b0 ffffffff`ffffffff go_bootstrap+0x6494e
00000000`28e5f7b8 00000000`00000001 0xffffffff`ffffffff
00000000`28e5f7c0 ffffffff`ffffffff 0x1
00000000`28e5f7c8 00000000`28e5f928 0xffffffff`ffffffff
00000000`28e5f7d0 00000000`00000000 0x28e5f928
. 5 Id: 263c.3204 Suspend: 1 Teb: 000007ff`fffae000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2905fb08 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`2905fb10 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`2905fbb0 000000c0`0002c980 go_bootstrap+0x6494e
00000000`2905fbb8 00000000`00000000 0xc0`0002c980
. 6 Id: 263c.32f0 Suspend: 1 Teb: 000007ff`fffac000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2925fb08 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`2925fb10 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`2925fbb0 000000c0`0002cd00 go_bootstrap+0x6494e
00000000`2925fbb8 00000000`00000164 0xc0`0002cd00
00000000`2925fbc0 7fffffff`00000000 0x164
00000000`2925fbc8 00000000`00000160 0x7fffffff`00000000
00000000`2925fbd0 000000c0`004c6300 0x160
00000000`2925fbd8 00000000`2925fcc0 0xc0`004c6300
00000000`2925fbe0 00000000`0043daa2 0x2925fcc0
00000000`2925fbe8 00000000`00b36bf8 go_bootstrap+0x3daa2
00000000`2925fbf0 00000000`00000000 go_bootstrap+0x736bf8
. 7 Id: 263c.29d8 Suspend: 1 Teb: 000007ff`fffaa000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2945fb08 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`2945fb10 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`2945fbb0 000000c0`00080280 go_bootstrap+0x6494e
00000000`2945fbb8 00000000`00000000 0xc0`00080280
. 8 Id: 263c.104c Suspend: 1 Teb: 000007ff`fffa8000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`29a8fb08 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`29a8fb10 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`29a8fbb0 000000c0`00206280 go_bootstrap+0x6494e
00000000`29a8fbb8 00000000`00000000 0xc0`00206280
. 9 Id: 263c.31b4 Suspend: 1 Teb: 000007ff`fffa6000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`29ccfb08 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`29ccfb10 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`29ccfbb0 000000c0`00207080 go_bootstrap+0x6494e
00000000`29ccfbb8 00000000`00000000 0xc0`00207080
. 10 Id: 263c.2b14 Suspend: 1 Teb: 000007ff`fffa4000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`29eceb68 00000000`76f48f58 ntdll!ZwWaitForSingleObject+0xa
00000000`29eceb70 00000000`76f48e54 ntdll!RtlDeNormalizeProcessParams+0x5a8
00000000`29ecec20 000007fe`fa3b7f0b ntdll!RtlDeNormalizeProcessParams+0x4a4
00000000`29ecec50 000007fe`fa3b8504 TmUmEvt64+0x17f0b
00000000`29eceeb0 000007fe`fa3b8c96 TmUmEvt64+0x18504
00000000`29ecef10 000007fe`fa4565ca TmUmEvt64+0x18c96
00000000`29ecefa0 000007fe`fa455f8e TmUmEvt64+0xb65ca
00000000`29ecf000 000007fe`fa410686 TmUmEvt64+0xb5f8e
00000000`29ecf150 000007fe`fa439730 TmUmEvt64+0x70686
00000000`29ecf260 00000000`7472f146 TmUmEvt64+0x99730
00000000`29ecf4a0 00000000`747e2d7d tmmon64+0x2f146
00000000`29ecf580 00000000`747e29f4 tmmon64+0xe2d7d
00000000`29ecf640 00000000`74733748 tmmon64+0xe29f4
00000000`29ecf6b0 000007fe`fcc77c3f tmmon64+0x33748
00000000`29ecf780 00000000`0046494e KERNELBASE!ResumeThread+0xf
00000000`29ecf7b0 ffffffff`ffffffff go_bootstrap+0x6494e
00000000`29ecf7b8 00000000`00000000 0xffffffff`ffffffff
. 11 Id: 263c.30b4 Suspend: 1 Teb: 000007ff`fffa2000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2a10fb08 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`2a10fb10 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`2a10fbb0 000000c0`00195400 go_bootstrap+0x6494e
00000000`2a10fbb8 00000000`00000009 0xc0`00195400
00000000`2a10fbc0 00000000`00000000 0x9
. 12 Id: 263c.30fc Suspend: 1 Teb: 000007ff`fffa0000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2a30f248 00000000`76f48f58 ntdll!ZwWaitForSingleObject+0xa
00000000`2a30f250 00000000`76f48e54 ntdll!RtlDeNormalizeProcessParams+0x5a8
00000000`2a30f300 000007fe`fa3b7f0b ntdll!RtlDeNormalizeProcessParams+0x4a4
00000000`2a30f330 000007fe`fa3b8504 TmUmEvt64+0x17f0b
00000000`2a30f590 000007fe`fa3b8c96 TmUmEvt64+0x18504
00000000`2a30f5f0 000007fe`fa4565ca TmUmEvt64+0x18c96
00000000`2a30f680 000007fe`fa455f8e TmUmEvt64+0xb65ca
00000000`2a30f6e0 000007fe`fa410686 TmUmEvt64+0xb5f8e
00000000`2a30f830 000007fe`fa4363b0 TmUmEvt64+0x70686
00000000`2a30f940 00000000`7472f146 TmUmEvt64+0x963b0
00000000`2a30fb80 00000000`747e2d7d tmmon64+0x2f146
00000000`2a30fc60 00000000`747e29f4 tmmon64+0xe2d7d
00000000`2a30fd20 00000000`74732869 tmmon64+0xe29f4
00000000`2a30fd90 00000000`0046494e tmmon64+0x32869
00000000`2a30fe60 000000c0`00306100 go_bootstrap+0x6494e
00000000`2a30fe68 000000c0`0016b840 0xc0`00306100
00000000`2a30fe70 00000000`2a30fe60 0xc0`0016b840
00000000`2a30fe78 00000000`00000000 0x2a30fe60
. 13 Id: 263c.13a0 Suspend: 2 Teb: 000007ff`fff9e000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2a50ec50 000007fe`fa3b8504 TmUmEvt64+0x17fa0
00000000`2a50eeb0 000007fe`fa3b8c96 TmUmEvt64+0x18504
00000000`2a50ef10 000007fe`fa4565ca TmUmEvt64+0x18c96
00000000`2a50efa0 000007fe`fa455f8e TmUmEvt64+0xb65ca
00000000`2a50f000 000007fe`fa410686 TmUmEvt64+0xb5f8e
00000000`2a50f150 000007fe`fa439730 TmUmEvt64+0x70686
00000000`2a50f260 00000000`7472f146 TmUmEvt64+0x99730
00000000`2a50f4a0 00000000`747e2d7d tmmon64+0x2f146
00000000`2a50f580 00000000`747e29f4 tmmon64+0xe2d7d
00000000`2a50f640 00000000`74733748 tmmon64+0xe29f4
00000000`2a50f6b0 000007fe`fcc77c3f tmmon64+0x33748
00000000`2a50f780 00000000`0046494e KERNELBASE!ResumeThread+0xf
00000000`2a50f7b0 ffffffff`ffffffff go_bootstrap+0x6494e
00000000`2a50f7b8 00000000`00000000 0xffffffff`ffffffff
. 15 Id: 263c.1c34 Suspend: 1 Teb: 000007ff`fff9a000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2a90faf8 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`2a90fb00 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`2a90fba0 000000c0`003b9400 go_bootstrap+0x6494e
00000000`2a90fba8 ffffffff`fff85ee0 0xc0`003b9400
00000000`2a90fbb0 00000000`00000000 0xffffffff`fff85ee0
. 16 Id: 263c.2530 Suspend: 1 Teb: 000007ff`fff98000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2ab0fb08 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`2ab0fb10 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`2ab0fbb0 000000c0`003b9780 go_bootstrap+0x6494e
00000000`2ab0fbb8 00000000`00000009 0xc0`003b9780
00000000`2ab0fbc0 00000000`00000000 0x9
. 17 Id: 263c.3114 Suspend: 1 Teb: 000007ff`fff96000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2ad0fb08 000007fe`fcc710ac ntdll!ZwWaitForSingleObject+0xa
00000000`2ad0fb10 00000000`0046494e KERNELBASE!WaitForSingleObjectEx+0x9c
00000000`2ad0fbb0 000000c0`00508d00 go_bootstrap+0x6494e
00000000`2ad0fbb8 00000000`00000000 0xc0`00508d00
. 18 Id: 263c.3344 Suspend: 3 Teb: 000007ff`fff94000 Unfrozen
Start: go_bootstrap+0x64d00 (00000000`00464d00)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2af0fb08 000007fe`fcc71430 ntdll!ZwWaitForMultipleObjects+0xa
00000000`2af0fb10 00000000`76df06c0 KERNELBASE!GetCurrentProcess+0x40
00000000`2af0fc10 00000000`0046494e kernel32!WaitForMultipleObjects+0xb0
00000000`2af0fca0 000007ff`fff94000 go_bootstrap+0x6494e
00000000`2af0fca8 00000000`00000000 0x7ff`fff94000
. 19 Id: 263c.3128 Suspend: 1 Teb: 000007ff`fff92000 Unfrozen
Start: ntdll!DbgUiRemoteBreakin (00000000`76ff2dd0)
Priority: 0 Priority class: 32 Affinity: f
Child-SP RetAddr Call Site
00000000`2b10ff28 00000000`76ff2e08 ntdll!DbgBreakPoint
00000000`2b10ff30 00000000`76df59cd ntdll!DbgUiRemoteBreakin+0x38
00000000`2b10ff60 00000000`76f2a561 kernel32!BaseThreadInitThunk+0xd
00000000`2b10ff90 00000000`00000000 ntdll!RtlUserThreadStart+0x21
Total threads: 20
Duplicate callstacks: 1 (windbg thread #s follow):
14
我曾经能够使用Delve一次来检查这个bug(参见#35775(评论)),但现在不行了。Delve现在只是无法附加。
我可以在特定的计算机上非常可靠地重现这个问题——make.bat从未完成。有时它会在go_bootstrap.exe中挂起,有时会在compile.exe中挂起。有时有多个挂起的compile.exe。
如果我将源代码更改为将runtime.preemptMSupported设置为false,我就可以解决这个问题。
8条答案
按热度按时间dhxwm5r41#
感谢您的详细报告。
大部分线程看起来都不太有趣,除了我认为以下两个:
这些线程都卡在了
ResumeThread
中,我不知道线程竟然会卡住。线程13也很有趣,因为“挂起计数”是2,这表明某个其他线程已经挂起它,并且无法恢复它。这也可能是我们为什么知道线程4和10在明显阻塞的操作中停止,而线程13在看似随机的地方停止的原因。
您知道“tmmon64”和“TmUmEvt64”是什么吗?
也许我们只需要长时间持有挂起锁(尽管我没有理论说明为什么这会是这样)。如果将
unlock(&suspendLock)
从preemptM
移动到函数的底部会发生什么?ebdffaop2#
你知道 "tmmon64" 和 "TmUmEvt64" 是什么吗?
这不是我的电脑,所以我不能正确地操作它。但我怀疑这台电脑上安装了一些标准的病毒软件。这类软件通常会将它们的代码安装到拦截真实的 Win32 API 调用中。
也许我们只需要延长 suspendLock 的时间(尽管我不知道为什么这会有用)。如果你把
unlock(&suspendLock)
从preemptM
移动到函数的底部会发生什么?周末我见不到她。但我会在周一或周二尝试一下。请也显示你建议更改的差异,因为我不信任自己能读懂你的心思。
谢谢。
Alex
sczxawaw3#
也许我们需要让suspendLock保持更长的时间(尽管我没有理论说明为什么这会是这样)。如果你把
unlock(&suspendLock)
移动到preemptM
的底部会发生什么?我修改了代码,如下所示:
我设法成功运行了一次make.bat。但然后它像以前一样挂起,当我第二次运行make.bat时。这一次,是compile.exe挂起了。这是来自windbg的堆栈跟踪信息:
Alex
jfewjypa4#
我刚刚尝试验证这个问题,但在af9ab6b上仍然存在问题。它在这里卡住了
当卡住时,进程树的样子如下:
这是windbg关于pid为11956的compile.exe进程的信息:
Alex
k3bvogb15#
感谢您提供的两个dump。
我在周围进行了更多的搜索,我几乎可以确定tmmon64和TmUmEvt64与趋势科技杀毒软件有关,这与您在#36492(评论)中所说的相符。
不幸的是,我认为它的系统调用拦截正在引入一个导致死锁的锁周期。
在#36492(评论)中,线程6和8的挂起计数大于1。线程0和6(再次)处于ResumeThread中。因此,线程6必须因抢占而暂停线程8,然后当它试图恢复线程8时,线程0因抢占而暂停线程6。有趣的是,这三个线程都通过tmmon64/TmUmEvt64进入Windows内存分配函数。我的猜测是在线程0和6之间有一个循环:线程6上的TmUmEvt64锁定了ResumeThread中的Windows堆,然后带着这个锁被挂起。当线程0试图用ResumeThread恢复它时,TmUmEvt64再次尝试锁定Windows堆,但无法获得该锁,所以陷入僵局。
36492(评论)显示了类似的证据:线程6在RtlUnlockHeap(通过TmUmEvt64)中被挂起,线程4在GetThreadContext -> TmUmEvt64 -> RtlAllocateHeap中,表明它已经挂起线程6并且在Windows堆锁上陷入了一个锁周期。即使通过移动解锁完全串行化线程挂起/恢复也无法提供足够的帮助,因为TmUmEvt64可以通过其他方式进入Windows堆函数。
因此,最终,这可能是趋势科技的一个bug,但这只是因为我们在挂起自己的线程方面做了一些非常不寻常的事情,这很遗憾,很可能是我们的问题。使用SuspendThread的缺点越来越多,但我不知道有什么可以替代它。 :(
agyaoht76#
迷人。似乎.NET使用SuspendThread来驱动线程到GC安全点。他们似乎在Windows堆锁方面遇到了类似的问题,尽管与系统调用拦截器没有具体关系。
我没有在threadsuspend.cpp中看到任何显然与我们不同的东西,但有一个关于操作系统资源和SuspendThread的巨大注解,表明它们仔细同步每次进入和离开托管代码的过渡(假设这包括每个“系统调用”),因此它们甚至不尝试挂起不在托管代码中的线程。如果我正确地跟踪了这些曲折的通道,最终会到达DisablePreemptiveGC、EnablePreemptiveGC和RareDisablePreemptiveGC、RareEnablePreemptiveGC,它们看起来可以根据GC抢占状态阻止进入和离开托管代码的过渡。
q5lcpyga7#
我又在周围做了一些搜索,我几乎确定tmmon64和TmUmEvt64与趋势科技杀毒软件有关。
你可能是对的。我在工作中使用这台电脑。我们的管理员在上面运行他们喜欢的任何软件。
我们正在做一些非常不寻常的事情,暂停我们自己的线程,这很遗憾,可能使这个问题成为我们的。
我同意。我在那台电脑上运行了很多不同的程序,没有一个程序会挂起。
这使得Go构建工具无法在这台电脑上使用。我怀疑用Go构建的程序也是如此。
这台电脑仍然运行着Windows 7 - 这在这些天里很少见。希望这个bug是罕见的。
使用SuspendThread的缺点越来越多,但我不知道有什么可以替代它。:(
就我个人而言,我不认为抢占有任何好处。我在Windows上不运行任何需要抢占的代码。我会只是在Windows上禁用抢占代码。你也将避免在Windows上遇到Delve问题。
有趣。看起来.NET使用SuspendThread来驱动线程到GC安全点。似乎他们在Windows堆锁方面遇到了类似的问题,尽管不是特别与系统调用拦截器相关。
这是完全可能的。但我预计会看到像Windows API描述中提到的那样的限制。我没有意识到有任何这样的东西。
添加@zx2c4,以防他有一些聪明的想法。
Alex
qlfbtfca8#
另一个尝试验证此问题的方法。我检查了ec51703(标记为go1.17)。这次更难打破它 - 它花了我3次运行make.bat才挂起。我不确定这是因为Go的新版本,还是因为我的操作系统上的软件发生了变化,或者是因为我的电脑超载或负载不足与其他程序。
以下是我的环境配置:
以下是我所做的:
以下是在
Process Explorer
程序中挂起的Go构建过程树的截图:设置
set GODEBUG=asyncpreemptoff=1
主要解决了我在构建和使用Go时遇到的问题。不幸的是,如果我在运行时包中运行一些测试,Go仍然会挂起,因为一些测试会静默地清除
GODEBUG
环境变量。只需搜索runtime包以获取有关internal/testenv.CleanCmdEnv
使用的详细信息。Alex