RHEL5.6中core_uses_pid对多线程程序无效的问题调查

需积分: 9 1 下载量 29 浏览量 更新于2024-09-17 收藏 182KB DOC 举报
"关于core_uses_pid标志对多线程程序无用的调查" 在RHEL5.6操作系统环境下,开发者发现了一个问题:当运行的进程包含线程时,生成的core dump文件名总是带有进程ID,即使尝试通过设置`core_uses_pid=0`来禁用此行为也无效。这个问题引发了一次深入的调查和分析。 首先,开发者在kernel.org的bug跟踪系统中找到了相关问题的记录(Bug ID: 6312)。该bug报告指出,即使设置了`core_uses_pid=0`,核心文件的名字仍然会包含进程ID,这与预期不符。然而,该bug已被标记为"REJECTED"且不会修复,原因是它被认为是旧版本内核的兼容性问题。 进一步的研究涉及到了内核源码的分析,特别是`format_corename`函数,这个函数负责生成core dump文件的名称。对比了两个不同版本的内核,即2.6.27.62和3.2.7,发现这个问题在3.2.7版本中已经被修复。问题的关键在于`nr_threads`参数,它表示使用该资源的线程数量,由内联函数`zap_threads`设置。在多线程程序中,`nr_threads`的非零值导致了core文件名中包含进程ID。 要解决这个问题,开发者需要找到一种方法来避免`zap_threads`函数设置`nr_threads`或使其不起作用。然而,由于这段代码在处理核心转储时通常无法绕过,因此寻找一个有效的解决方案变得具有挑战性。可能的解决方案可能包括修改内核源码,或者寻找其他机制来确保在多线程环境中生成的core文件名的唯一性,而不依赖于`core_uses_pid`标志。 在多线程程序中,生成的core dump文件通常用于调试线程崩溃或异常情况。确保core文件的命名规则能准确反映其来源对于故障排查至关重要。在某些情况下,如果不能通过`core_uses_pid`控制文件名,可能需要考虑使用其他手段,如自定义信号处理器来控制core文件的生成,或者利用特定的用户空间工具来重命名或管理这些文件。 这个问题揭示了在特定内核版本和多线程环境中,`core_uses_pid`标志的局限性。开发者需要对内核源码有深入理解,以便在遇到此类问题时能找到适当的变通办法。在更新的内核版本中,这个问题可能已经得到解决,但老版本的系统可能仍然存在这个问题,因此需要额外的注意和调试工作。