在进行调试时,“线程退出代码”指的是什么?它提供了什么信息?它是否有用或者只是一些不必关心的内部信息?
The thread 0x552c has exited with code 259 (0x103).
The thread 0x4440 has exited with code 0 (0x0).
有没有可能有一种可能的退出代码列表以及它的含义?
在进行调试时,“线程退出代码”指的是什么?它提供了什么信息?它是否有用或者只是一些不必关心的内部信息?
The thread 0x552c has exited with code 259 (0x103).
The thread 0x4440 has exited with code 0 (0x0).
有没有可能有一种可能的退出代码列表以及它的含义?
实际上关于这个主题好像并没有很多解释,但是退出代码应该用于指示线程如何退出,0
倾向于表示它安全退出,而其他任何东西倾向于表示它没有按预期退出。但是,你可以在代码中设置此退出代码,以完全忽略它。
我找到的最接近有用信息的链接是这个
引用来自上面的链接:
无论退出的方法如何,您从进程或线程返回的整数必须是0-255(8位)的值。零值表示成功,而非零值表示失败。尽管您可以尝试返回任何整数值作为退出代码,但只有该整数的最低字节作为退出代码的一部分从进程或线程返回。高阶字节由操作系统用于传达有关进程的特殊信息。退出代码在批处理/ shell程序中非常有用,这些程序根据一个程序的成功或失败有条件地执行其他程序。
来自GetEXitCodeThread文档:
重要提示:GetExitCodeThread函数仅在线程终止后才返回应用程序定义的有效错误代码。 因此,应用程序不应将STILL_ACTIVE(259)用作错误代码。 如果线程返回STILL_ACTIVE(259)作为错误代码,则测试此值的应用程序可能会将其解释为线程仍在运行,并在线程终止后继续测试线程的完成,这可能使应用程序陷入无限循环。
我对这一切的理解是,如果你在自己的应用程序中使用线程来服务于它本身,那么退出代码并不是很重要。例外情况可能是当你同时运行几个有依赖关系的线程时。如果需要外部源读取此错误代码,则可以将其设置为让其他应用程序了解您的线程的状态。
就像Sayse所提到的那样,在这种情况下,退出码259(0x103)
有着特殊的意义,也就是被调试的进程仍在运行。
我在调试 Web 服务时经常会看到这种情况,因为线程在执行每个 Web 服务调用后继续运行(因为它仍在等待进一步的调用)。
RunAsync().Wait();
- Bron Daviesstatic void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }
问题在于,任务由线程池线程执行,基于线程池的启发式算法,即使您的任务已经完成,它可能不会终止该线程。该线程只是返回到等待分配下一个任务的线程池线程池中。这就是为什么此处的退出代码 STILL_ACTIVE(259)听起来如此直观的原因。 - RBT