- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我通过指定 /GS-
编译器标志和 /NoDefaultLib
链接器标志,使用 Microsoft Visual Studio 创建了一个最小的、无 CRT 的、依赖性耗尽的可执行文件,并且将主函数命名为 mainCRTStartup
。应用程序不会创建额外的线程并在 < 5 秒后从 mainCRTStartup
返回,但进程终止总共需要 30 秒。
根据我的经验,如果在 Windows 10 上执行的应用程序仅依赖于默认加载到每个 Windows 进程中的动态库,命名为 ntdll.dll
、KernelBase.dll
和kernel32.dll
,当主线程从mainCRTStartup
函数返回时,进程正常退出。
如果静态或动态加载其他库(例如通过调用 LoadLibraryW
),从主函数返回将使进程保持事件状态:正常运行时为 30 秒,在调试器下运行时为无限期。
在创建进程时,Windows 10 进程加载器会创建额外的线程来更快地加载动态库,请参阅:
Cylance 在 Windows 10 Parallel Loading Breakdown 中提到:
The worker thread idle timeout is set to 30 seconds. Programs which execute in less than 30 seconds will appear to hang due to
ntdll!TppWorkerThreadwaiting
for the idle timeout before the process terminates.
Microsoft 在 Terminating a Process: How Processes are Terminated 中提到:
Note that some implementation of the C run-time library (CRT) call ExitProcess if the primary thread of the process returns.
另一方面,Microsoft 在 ExitProcess
中提到:
Note that returning from the main function of an application results in a call to
ExitProcess
.
这是我使用的最小测试代码,我使用了 kernel32!CloseHandle
和 user32!CloseWindow
作为示例,对它们的调用实际上没有做任何事情:
#include <cstdint>
namespace windows {
typedef const intptr_t Handle;
typedef const void * Module;
constexpr Handle InvalidHandleValue = -1;
namespace kernel32 {
extern "C" uint32_t __stdcall CloseHandle(Handle);
extern "C" uint32_t __stdcall FreeLibrary(Module);
extern "C" Module __stdcall LoadLibraryW(const wchar_t *);
}
namespace user32 {
extern "C" uint32_t __stdcall CloseWindow(Handle);
}
}
int mainCRTStartup() {
// 0 seconds
// windows::kernel32::CloseHandle(windows::InvalidHandleValue);
// 30 seconds
// windows::user32::CloseWindow(windows::InvalidHandleValue);
// 0 seconds
// windows::kernel32::FreeLibrary(windows::kernel32::LoadLibraryW(L"kernel32.dll"));
// 30 seconds
// windows::kernel32::FreeLibrary(windows::kernel32::LoadLibraryW(L"user32.dll"));
// 0 seconds
// windows::kernel32::FreeLibrary(windows::kernel32::LoadLibraryW(L""));
return 0;
}
在 mainCRTStartup
函数中注释 WinAPI 用法会导致上述相应 WinAPI 调用的执行时间。
这是在a debugger中追踪到的程序的执行流程在伪 C++ 中:
ntdll.RtlUserThreadStart() {
kernel32.BaseThreadInitThunk() {
const auto return_code = test.mainCRTStartup();
ntdll.RtlExitUserThread(return_code) {
if (ntdll.NtQueryInformationThread(CURRENT_THREAD, ThreadAmILastThread) != STATUS_SUCCESS || !AmILastThread) {
// Bad path - for `30 seconds`.
ntdll.LdrShutdownThread();
ntdll.TpCheckTerminateWorker(0);
ntdll.NtTerminateThread(0, return_code);
// The thread execution does not return from `NtTerminateThread`, but the process still runs.
} else {
// Good path - for `0 seconds`.
ntdll.RtlExitUserProcess(return_code) {
ntdll.EtwpShutdownPrivateLoggers();
ntdll.LdrpDrainWorkQueue(0);
ntdll.LdrpAcquireLoaderLock();
ntdll.RtlEnterCriticalSection(ntdll.FastPebLock);
ntdll.RtlLockHeap(peb.ProcessHeap);
ntdll.NtTerminateProcess(0, return_code);
ntdll.RtlUnlockProcessHeapOnProcessTerminate();
ntdll.RtlLeaveCriticalSection(ntdll.FastPebLock);
ntdll.RtlReportSilentProcessExit(CURRENT_PROCESS, return_code);
ntdll.LdrShutdownProcess();
ntdll.NtTerminateProcess(CURRENT_PROCESS, return_code);
// The thread execution does not return from `NtTerminateProcess` and the process is terminated.
}
}
}
}
}
如果进程没有创建额外的线程并从主函数返回,我预计进程会终止。
调用 ExitProcess
在 main 函数结束时终止进程,即使调用 WinAPI 导致之前 30 秒执行。使用此 API 并不总是可行的,因为有问题的应用程序可能不是我的,而是第三方应用程序(来自 Microsoft),如下所示:Why would a process hang within RtlExitUserProcess/LdrpDrainWorkQueue?
在我看来,Windows 10 进程加载器已损坏,即使 Microsoft 进程的行为不正确也是如此。
最佳答案
I expected the process to terminate if it does not create additional threads and returns from the main function.
进程可以隐式创建额外的线程。例如装载机。需要理解什么意思
returns from the main function
这里是指从标准 CRT mainCRTStartup
函数调用的函数。在 mainCRTStartup
调用 ExitProcess
之后。所以不是任何 exe 入口真正的入口点函数,而是一些从入口点调用的子函数。但入口点调用 ExitProcess
比。
如果我们不使用 CRT - 我们需要自己调用 ExitProcess
。如果我们只是从入口点返回 - 将是 RtlExitUserThread
,它不会调用 ExitProcess
,除非这是进程中的最后一个线程 (AmILastThread
)(这里如果 2 个或更多线程并行调用 ExitThread
)
关于c++ - 从 exe 入口点返回不会终止 Windows 10 上的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58561951/
通常入口重写目标的工作原理如下: nginx.ingress.kubernetes.io/rewrite-target: / 这将重写服务名称的目标,因为它们在根目录中。所以如果我有这个: apiVe
我正在使用 Helm 部署的 GKE (1.8.5-gke.0) 上运行 traefik 入口 Controller 。我观察到的是请求经常得到 404 响应。 看起来 traefik 会不断重新加载
是否可以在没有负载均衡器的情况下在 Kubernetes 中使用 Ingress Controller 功能(在 Digital Ocean 中)。 有没有其他机制可以让域名映射到Kubernetes
我使用 KOPS 和 nginx-ingress 在 AWS 上部署了 Kubernetes。 为了评估多个云(并削减成本),我想在 GKE 上进行部署。一切正常,除了该死的 Ingress。 (这是
要求:想要使用带有 HTTPS 的入口部署 Minio 和另一个后端服务(不用于生产目的) 我一直在尝试创建一个入口以从 GKE 中的 Kubernetes 集群外部访问两个服务。这些是我尝试过的尝试
我对使用漏斗可视化功能的谷歌分析有点坚持。 输入漏斗可视化时,它会显示带有数字的“(入口)”。 这代表什么? 最佳答案 这表示在漏斗中第一步所代表的特定页面或一组页面上进入您网站的人数。 关于goog
我尝试在我的 kubernetes 集群上配置入口。我关注了documentation安装入口 Controller 并运行以下命令 kubectl apply -f https://raw.gith
我无法连接到使用 nginx 入口运行的应用程序(Docker Desktop win 10)。 nginx-ingress Controller pod 正在运行,应用程序运行良好,并且我创建了一个
我试图弄清楚如何使用具有某些特定规则的 nginx 代理缓存。例如,当我托管 Ghost 或 Wordpress 时,我不想缓存管理部分。使用服务器片段,我尝试了很多不同的组合,但在管理部分的缓存仍然
我正在尝试将AKS入口的IP列入白名单。我目前正在使用未随Helm一起安装的ingress-nginx。 强制性kubernetes资源可以在here中找到 服务启动为: spec: extern
我的机构有防火墙设置,阻止了大部分外部端口,目前,我有内部 Linux 虚拟机,例如, http://abc.xyz:5555 (此链接只能在内网访问),并且管理员设置了Netscaler,以便将内部
我正在尝试根据用户代理代理_传递流量。试图为它使用服务器代码段/配置代码段,但入口不允许我。 (禁止在 server-snippet 中使用 proxy_pass 并在 configuration-s
我已经使用 nginx-stable 安装了 nginx helm 图表和配置的入口规则如下。虽然它仅适用于根路径,如下所示, /user/login - working /user/register
使用 KOPS 在 AWS 上部署 k8s。 我已经创建了 nginx 入口 https://github.com/kubernetes/ingress-nginx nginx-ingress-con
在我的聊天应用程序中,当一个用户将另一个人添加到他/她的联系人列表中时,服务器条目显示 BOTH 订阅,但在我的应用程序中,代码根据 TO/FROM 订阅工作(就像在接受 friend 请求之前一样)
我在 Python 中有一个实用程序模块,它需要知道正在使用它的应用程序的名称。实际上,这意味着被调用以启动应用程序的顶级 python 脚本的名称(即,其中__name=="__main__"为真)
在这种情况下,我将如何实现“OnButtonClick”以便在按下按钮时打印用户输入“e1”? from Tkinter import * class App: def __init__
我使用以下命令在本地生成 key 。 openssl genrsa -out testsvc.testns.ing.lb.xyz.io.key.pem 2048 并使用以下命令生成 CSR(证书签名请
我正在运行 mint 17.2 kde。 我通过在 ~/Downloads/中运行 idea.sh 安装了 intellij CE 然后我将 intellij 移动到/usr/lib/。现在,当我尝试
我无法让 Controller 工作。尝试了很多次,我仍然得到 Error: ImagePullBackOff。 有没有我可以尝试的替代方案或者它失败的原因? kubectl apply -f
我是一名优秀的程序员,十分优秀!