程序崩溃找不到原因

时间:2023-02-20 20:08:15
程序太大无法贴上来。用core file来看,以下信息,大神指导一下是什么原因?

GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "arm-hisiv200-linux"...

warning: exec file is newer than core file.
Reading symbols from /lib/libpthread.so.0...done.
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/libncurses.so.5...done.
Loaded symbols for /lib/libncurses.so.5
Reading symbols from /lib/libstdc++.so.6...done.
Loaded symbols for /lib/libstdc++.so.6
Reading symbols from /lib/libm.so.6...done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.3...done.
Loaded symbols for /lib/ld-linux.so.3
Core was generated by `./communicate -d/dev/ttyAMA1'.
Program terminated with signal 6, Aborted.
[New process 4216]
[New process 4215]
[New process 1654]
[New process 1655]
#0  0x2ad82678 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:67
67      ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
        in ../nptl/sysdeps/unix/sysv/linux/raise.c
(gdb) backtrace
#0  0x2ad82678 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:67
#1  0x2ad881ec in *__GI_abort () at abort.c:92
#2  0x2acb6294 in __gnu_cxx::__verbose_terminate_handler () at ../../../../../gcc-4.4-2010q1/libstdc++-v3/libsupc++/vterminate.cc:93
#3  0x2acb3a4c in __cxxabiv1::__terminate (handler=0) at ../../../../../gcc-4.4-2010q1/libstdc++-v3/libsupc++/eh_terminate.cc:38
#4  0x2acb3a74 in std::terminate () at ../../../../../gcc-4.4-2010q1/libstdc++-v3/libsupc++/eh_terminate.cc:48
#5  0x2acb39e4 in __gxx_personality_v0 (state=<value optimized out>, ue_header=0x2bf8c6a8, context=0x2bf8b508) at ../../../../../gcc-4.4-2010q1/libstdc++-v3/libsupc++/eh_personality.cc:675
#6  0x2ab49a68 in unwind_phase2_forced (ucbp=0x2bf8c6a8, entry_vrs=<value optimized out>, resuming=<value optimized out>)
    at ../../../../gcc-4.4-2010q1/libgcc/../gcc/config/arm/unwind-arm.c:747
#7  0x2ab4a8b8 in ___Unwind_ForcedUnwind () at ../../../../gcc-4.4-2010q1/libgcc/../gcc/config/arm/libunwind.S:332
#8  0x2aba0410 in _Unwind_ForcedUnwind (exc=0x2bf8c6a8, stop=0x2ab9d8b0 <unwind_stop>, stop_argument=0x2bf8bde0) at ../ports/sysdeps/unix/sysv/linux/arm/eabi/nptl/unwind-forcedunwind.c:149
#9  0x2ab9d864 in *__GI___pthread_unwind (buf=0x2bf8bde0) at unwind.c:130
#10 0x2ab9349c in sigcancel_handler (sig=<value optimized out>, si=<value optimized out>, ctx=<value optimized out>) at ../nptl/pthreadP.h:265
#11 <signal handler called>
#12 0x0002e1a8 in timer_fnc (arg=0x2b69cd28) at /root/hisi/communicate/srcs/libctb-0.16/src/linux/timer.cpp:32
#13 0x2ab94a8c in start_thread (arg=<value optimized out>) at pthread_create.c:302
#14 0x2ae32388 in clone () from /lib/libc.so.6

2 个解决方案

#1


timer_fnc里调用了cancel例程?里面发生了异常?

#2


引用 1 楼 mydo 的回复:
timer_fnc里调用了cancel例程?里面发生了异常?

版主说的很对,程序中不使用这个timer 就没有问题,这是开源库ctb-0.16里的代码,可以看出什么问题吗?

namespace ctb {

// a dummy function, see below
    static void timer_exit(void* arg)
    {
    };

    static void* timer_fnc(void* arg)
    {
   // the timer thread should be canceled every time
   // (asyncronously)
   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
   // this is tricky, but absolutly necessarily to avoid segfaults
   // if the destructor finished a running thread
   pthread_cleanup_push(timer_exit,NULL);
   timer_control *tc = (timer_control*)arg;
   // linux allows a real sleep, means the timer thread will
   // be sleeping (no reduce of the system performance) 
   usleep(tc->usecs);
   // time is over, system reawake the thread.
   // if there is an exit function, calling it
   if(tc->exitfnc) tc->exitfnc(NULL);
   // set the exit flag
   if(tc->exitflag) *tc->exitflag = 1;
   // deallocate the system resources (thread)
   pthread_cleanup_pop(1);
   return NULL;
    };

    // the constructor initiate the internal control struct
    Timer::Timer( unsigned int msecs, int* exitflag, void*( *exitfnc )(void*) )
    {
   control.usecs = msecs * 1000;
   control.exitflag = exitflag;
   control.exitfnc = exitfnc;
   stopped = 1;
    };

    // if a timer instance leave it's valid range, it automaticaly will
    // be finished
    Timer::~Timer()
    {
   if(!stopped) {
  // only a running thread may be canceled
  stop();
   }
    };

    // starts the timer thread
    int Timer::start()
    {
   stopped = 0;
   if(pthread_create(&tid, // result parameter, covers the id
 // of the new threads
 NULL, // thread attribute object, NULL means
 // the defaults
 timer_fnc, // start function of the thread
 &control // start function parameter, must refer
 // as void*
) == -1) {
  return -1; // there was something going wrong
   }
   pthread_detach(tid); // thread status must be "detach". In the other
   // case, the destructor call of a running
   // thread throws a segfault
   return 0;
    };

    // stop the timer thread
    int Timer::stop()
    {
   if(control.exitflag && (*control.exitflag == 0)) {
  pthread_cancel(tid);
   }
   stopped = 1;
   return 0;
    };

    void sleepms(unsigned int ms)
    {
   usleep(ms * 1000);
    };

} // namespace ctb

主程序是生成一个自己的pthread,一直调用ctb库的Writev,这个Writev使用了上面的定时器,不调用Writv就不会崩,调用会跑一段时间后(几十分钟到2小时之间)就会崩。

int IOBase::Writev(char* buf,size_t len,unsigned int timeout_in_ms)
    {
   char *cp = buf;
   int n = 0;
   int timeout = 0;
   size_t towrite = len;

   Timer t(timeout_in_ms,&timeout,NULL);
   if(timeout_in_ms != 0xFFFFFFFF) {
  t.start();
   }

   while(!timeout && (towrite > 0)) {
  if((n = Write(cp,towrite)) < 0) {
 // an error occurs
 break;
  }
  if(!n) {
 sleepms(1);
  }
  towrite -= n;
  cp += n;
   }
   return (len - towrite);
    };

#1


timer_fnc里调用了cancel例程?里面发生了异常?

#2


引用 1 楼 mydo 的回复:
timer_fnc里调用了cancel例程?里面发生了异常?

版主说的很对,程序中不使用这个timer 就没有问题,这是开源库ctb-0.16里的代码,可以看出什么问题吗?

namespace ctb {

// a dummy function, see below
    static void timer_exit(void* arg)
    {
    };

    static void* timer_fnc(void* arg)
    {
   // the timer thread should be canceled every time
   // (asyncronously)
   pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
   // this is tricky, but absolutly necessarily to avoid segfaults
   // if the destructor finished a running thread
   pthread_cleanup_push(timer_exit,NULL);
   timer_control *tc = (timer_control*)arg;
   // linux allows a real sleep, means the timer thread will
   // be sleeping (no reduce of the system performance) 
   usleep(tc->usecs);
   // time is over, system reawake the thread.
   // if there is an exit function, calling it
   if(tc->exitfnc) tc->exitfnc(NULL);
   // set the exit flag
   if(tc->exitflag) *tc->exitflag = 1;
   // deallocate the system resources (thread)
   pthread_cleanup_pop(1);
   return NULL;
    };

    // the constructor initiate the internal control struct
    Timer::Timer( unsigned int msecs, int* exitflag, void*( *exitfnc )(void*) )
    {
   control.usecs = msecs * 1000;
   control.exitflag = exitflag;
   control.exitfnc = exitfnc;
   stopped = 1;
    };

    // if a timer instance leave it's valid range, it automaticaly will
    // be finished
    Timer::~Timer()
    {
   if(!stopped) {
  // only a running thread may be canceled
  stop();
   }
    };

    // starts the timer thread
    int Timer::start()
    {
   stopped = 0;
   if(pthread_create(&tid, // result parameter, covers the id
 // of the new threads
 NULL, // thread attribute object, NULL means
 // the defaults
 timer_fnc, // start function of the thread
 &control // start function parameter, must refer
 // as void*
) == -1) {
  return -1; // there was something going wrong
   }
   pthread_detach(tid); // thread status must be "detach". In the other
   // case, the destructor call of a running
   // thread throws a segfault
   return 0;
    };

    // stop the timer thread
    int Timer::stop()
    {
   if(control.exitflag && (*control.exitflag == 0)) {
  pthread_cancel(tid);
   }
   stopped = 1;
   return 0;
    };

    void sleepms(unsigned int ms)
    {
   usleep(ms * 1000);
    };

} // namespace ctb

主程序是生成一个自己的pthread,一直调用ctb库的Writev,这个Writev使用了上面的定时器,不调用Writv就不会崩,调用会跑一段时间后(几十分钟到2小时之间)就会崩。

int IOBase::Writev(char* buf,size_t len,unsigned int timeout_in_ms)
    {
   char *cp = buf;
   int n = 0;
   int timeout = 0;
   size_t towrite = len;

   Timer t(timeout_in_ms,&timeout,NULL);
   if(timeout_in_ms != 0xFFFFFFFF) {
  t.start();
   }

   while(!timeout && (towrite > 0)) {
  if((n = Write(cp,towrite)) < 0) {
 // an error occurs
 break;
  }
  if(!n) {
 sleepms(1);
  }
  towrite -= n;
  cp += n;
   }
   return (len - towrite);
    };