Linux C程序在fopen失败,堆栈跟踪已连接

Linux C程序在fopen失败,堆栈跟踪已连接,linux,gcc,kernel,malloc,fopen,Linux,Gcc,Kernel,Malloc,Fopen,我们已经移植了一个应用程序,在内核为4.10.1的Linux上运行。程序在_GI_abort()调用时似乎挂起,随后针对该进程发出SIGABRT,在该进程中,程序再次未能写入错误日志文件。这个程序在Linux内核2.6上运行。附加堆栈跟踪和代码。任何建议都会有帮助。谢谢 我们之前使用GCC6.3.1构建了4.10.1内核和应用程序 该应用程序已编译为: gcc版本6.3.1 20161221(红帽6.3.1-1)(gcc) 堆栈跟踪: (gdb) where #0 __lll_lock_wai

我们已经移植了一个应用程序,在内核为4.10.1的Linux上运行。程序在_GI_abort()调用时似乎挂起,随后针对该进程发出SIGABRT,在该进程中,程序再次未能写入错误日志文件。这个程序在Linux内核2.6上运行。附加堆栈跟踪和代码。任何建议都会有帮助。谢谢

我们之前使用GCC6.3.1构建了4.10.1内核和应用程序 该应用程序已编译为: gcc版本6.3.1 20161221(红帽6.3.1-1)(gcc)

堆栈跟踪:

(gdb) where
#0  __lll_lock_wait_private () at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
#1  0x00007f8f1c16ffb2 in __GI___libc_malloc (bytes=140252631706336, bytes@entry=552) at malloc.c:2923
#2  0x00007f8f1c15905d in __fopen_internal (filename=0x7ffeb54deac0 "/tmp/logs/app_exit.log", mode=0x497fc2 "a+", is32=1) at iofopen.c:69
#3  0x0000000000477690 in fep_sigbus_handler (signum=6, info=0x7ffeb54decb0, ptr=0x7ffeb54deb80) at app_util.c:559
#4  <signal handler called>
#5  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:58
#6  0x00007f8f1c12151a in __GI_abort () at abort.c:89
#7  0x00007f8f1c169d68 in __malloc_assert (
    assertion=assertion@entry=0x7f8f1c277f90 "(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)", file=file@entry=0x7f8f1c274807 "malloc.c", line=line@entry=2403,
    function=function@entry=0x7f8f1c2787d8 <__func__.11266> "sysmalloc") at malloc.c:301
#8  0x00007f8f1c16d5b6 in sysmalloc (nb=nb@entry=560, av=0x7f8f1c4aaae0 <main_arena>) at malloc.c:2400
#9  0x00007f8f1c16e63a in _int_malloc (av=av@entry=0x7f8f1c4aaae0 <main_arena>, bytes=bytes@entry=552) at malloc.c:3862
#10 0x00007f8f1c16ff14 in __GI___libc_malloc (bytes=bytes@entry=552) at malloc.c:2925
#11 0x00007f8f1c15905d in __fopen_internal (filename=0xf4cda4 <file_tbl+4> "/etc/app_config.dat", mode=0x48b735 "r", is32=1)
    at iofopen.c:69
#12 0x000000000042e96c in load_conversion_file (filename=0xf4cda4 <file_tbl+4> "/etc/app_config.dat") at app_config.c:1817
#13 0x000000000042ebc2 in load_all_conversion_files () at app_config.c:1864
#14 0x000000000042eeb9 in app_config_init () at app_config.c:1958
#15 0x0000000000403d9e in main (argc=1, argv=0x7ffeb54df6e8) at app_main.c:271

static int load_conversion_file( const char* filename )
{
    int     rc = FAILURE;
    FILE*   fd = NULL;
    int     parsedbg = (app_debug_mask & APP_DBG_PARSECONV) ? 1 : 0;
    AppCfg* pcfg;

    pcfg = (AppCfg*) malloc( sizeof(AppCfg) );

    if ( pcfg == NULL )
        LOG(APP_DBG_ERROR, BLANK_TID, ( "error allocating AppCfg\n" ));

    else if ( (fd = fopen( filename, "r" )) == NULL )
        LOG(APP_DBG_CONFIG, BLANK_TID, ( "error opening conversion file: %s\n",
                                              filename ) );

    else if ( app_parse_file( fd, pcfg, parsedbg ) != 0 )
        LOG(APP_DBG_CONFIG, BLANK_TID, ( "Parser error %s on line %d at token <%s>\n",
                                              app_parser_get_error_string(),
                                              app_parser_get_error_line(),
                                              app_parser_get_error_token() ) );
.
.
.
}
(gdb)其中
#在../sysdeps/unix/sysv/linux/x86\u 64/lowlevellock.S:95上的0\uull\u lock\u wait\u private()
#1 0x00007f8f1c16ffb2,位于malloc(字节=140252631706336,bytes@entry=552)在malloc.c:2923
#iofopen.c:69处的内部(文件名=0x7ffeb54deac0)/tmp/logs/app_exit.log,模式=0x497fc2“a+”,is32=1)中有2个0x00007f8f1c15905d
#3 0x0000000000477690位于应用程序c:559的fep_sigbus_处理程序中(信号=6,信息=0x7ffeb54decb0,ptr=0x7ffeb54deb80)
#4  
#5(信号)=sig@entry=6)位于../sysdeps/unix/sysv/linux/raise.c:58
#6 0x00007f8f1c12151a位于中止处的中止()中。c:89
#7 0x00007f8f1c169d68在malloc断言中(
断言=assertion@entry=0x7f8f8f1c277f90“(旧版顶部==初始顶部(av)和旧版大小==0)| |((无符号长)(旧版大小)>=旧版大小和上一版本(旧版顶部)和((无符号长)旧版结束和(页面大小-1))=0)”,文件=file@entry=0x7f8f1c274807“malloc.c”,第行=line@entry=2403,
作用=function@entry=0x7f8f1c2787d8“sysmalloc”),位于malloc.c:301
#sysmalloc中的8 0x00007f8f1c16d5b6(注意=nb@entry=560,av=0x7f8f1c4aaae0)在malloc.c:2400
#9 0x00007f8f1c16e63a英寸(平均)=av@entry=0x7f8f1c4aaae0,字节=bytes@entry=552)在malloc.c:3862
#10 0x00007f8f1c16ff14英寸(字节)=bytes@entry=552)在malloc.c:2925
#11 0x00007f8f1c15905d,内部(文件名=0xf4cda4“/etc/app_config.dat”,模式=0x48b735“r”,is32=1)
在iofopen。c:69
#在app_config.c:1817的load_conversion_文件(filename=0xf4cda4“/etc/app_config.dat”)中的12 0x000000000042e96c
#13 0x000000000042ebc2在app_config.c:1864加载所有转换文件()
#14 0x000000000042eeb9位于app_config.c:1958的app_config_init()中
#app_main的15 0x0000000000403d9e主管道(argc=1,argv=0x7ffeb54df6e8)c:271
静态整型加载转换文件(常量字符*文件名)
{
int rc=故障;
FILE*fd=NULL;
int parsedbg=(app_debug_mask&app_DBG_PARSECONV)?1:0;
AppCfg*pcfg;
pcfg=(AppCfg*)malloc(sizeof(AppCfg));
如果(pcfg==NULL)
日志(APP_DBG_ERROR,BLANK_TID,(“分配AppCfg时出错”);
else if((fd=fopen(文件名,“r”))==NULL)
日志(APP_DBG_CONFIG,BLANK_TID)(“打开转换文件时出错:%s\n”,
文件名);
else if(app_parse_文件(fd、pcfg、parsedbg)!=0)
日志(APP_DBG_CONFIG,BLANK_TID)(“语法分析器错误%s,位于令牌的第%d行\n”,
应用程序语法分析器获取错误字符串(),
应用程序语法分析器获取错误行(),
app_解析器_get_error_token());
.
.
.
}

其中一个函数中有一个calloc()内存分配,该函数是在fopen()之前调用的。该函数的代码填充了缓冲区calloced,并且也超过了最后一个条目。解决了这个问题后,问题就解决了。但是,以前版本的linux(使用较旧版本的gcc构建)中的代码没有在malloc()上断言和中止。

在我看来,代码中的其他地方出现了堆损坏。试着用valgrind运行它来找到它。不同的库版本做的事情不同。否则他们为什么会有新版本?较新的分配器可能更好地支持多线程、更少的内存碎片等。当您做错事情时,它恰好会失败。