我可以知道哪个线程从核心转储文件中更改了全局变量的值吗?

Posted

技术标签:

【中文标题】我可以知道哪个线程从核心转储文件中更改了全局变量的值吗?【英文标题】:Can I know which thread change the global variable's value from core dump file? 【发布时间】:2014-02-08 08:21:59 【问题描述】:

我的程序是一个用 C 语言编写的多线程程序,在 Solaris 上运行。

现在,一个变量(分配在堆中)有时会从有效值更改为NULL,因此在访问它时,会发生核心转储。

我已经尝试了所有我知道的方法:使用 libumem、添加日志、代码遍历,但什么都找不到。

所以当我再次分析核心转储文件时,我有一个奇妙的想法:我可以知道哪个线程从核心转储文件中更改了全局变量(包括从堆中分配的)的值吗?任何人都可以从核心转储文件中提供一些线索吗?

【问题讨论】:

不,不是。您可以尝试设置内存断点以查看变量何时设置为 NULL? 为什么不在访问之前检查NULL @NPE:接收消息时内存被malloced,处理完消息后,内存将被释放。这并不总是一个问题,所以我无法设置内存断点。 @SakthiKumar:检查 NULL 找不到这个错误的根本原因。 @NanXiao 检查 null 找不到你的根本原因它阻止它的原因。 【参考方案1】:

我可以知道哪个线程从核心转储文件中更改了全局变量(包括从堆中分配的)的值吗?

没有。

核心转储记录了进程内存在崩溃点的当前状态,而不是它的历史记录。就像在墙上看一张喷漆涂鸦的照片你不知道是谁画的一样,看核心转储中的NULL 也不会告诉你是谁把它放在那里的。

【讨论】:

以上是关于我可以知道哪个线程从核心转储文件中更改了全局变量的值吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 linux 内核核心转储中找到“HZ”值?

如何查看正在运行线程的CPU核心?

在linux上使用gdb调试核心转储时如何知道线程的状态?

(Mac) Cocoa 应用程序更改核心转储位置

有没有办法在gdb核心转储中获取线程的开始时间

将字符从文件读取行转换为 int 转储核心