【问题标题】:malloc() seg fault in localtime()?localtime() 中的 malloc() 段错误?
【发布时间】:2016-09-15 09:48:35
【问题描述】:

这是 ny 堆栈

malloc() at 0xb7dfd333  
strdup() at 0xb7e01866  
tzset_internal() at 0xb7e2ef68  
__tz_convert() at 0xb7e2f26a    
localtime() at 0xb7e2d901   
Send_Trace() at my_trace.c:265 0x8053373    

这是有问题的代码..

void Send_Trace(const char const *Trace_Text, ...)
{
   time_t time_now = time(NULL);
   tm = *localtime(&time_now);

它通常工作正常,但偶尔会抛出如上所示的 seg 错误。

有什么想法吗?

【问题讨论】:

  • 多个线程调用它?
  • 如果您使用的是 Linux,请尝试在 valgrind 下运行您的程序。很可能,内存较早损坏了,valgrind 可能会指出这一点。
  • 当你得到随机段错误时,通常是因为你在函数内部使用了一个局部变量,并在函数结束时尝试再次使用(抛出一个指针)。什么是 tm?
  • 内存损坏?
  • 如果可用,您是否尝试使用localtime 的可重入版本? localtime_r()。我的情况是你从一个信号或类似 ISR 的东西中调用 Send_Trace。

标签: c segmentation-fault


【解决方案1】:

有什么想法吗?

mallocfree 内部的任何崩溃在 99.999% 的情况下都是其他地方早期堆损坏的结果。

可能导致malloc 中后续崩溃的堆损坏示例:在未分配的内存上调用free,在某个指针上调用free 两次,堆分配的缓冲区上溢或下溢等.

查找此类错误的最快方法是:valgrind(如果在您的平台上可用)或AddressSanitizer(在最新版本的 Clang 和 GCC 中实现)。

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2014-03-29
    相关资源
    最近更新 更多