- 主题:[求助]帮忙指导看下一个程序死机的问题吧
- 程序的功能很简单,FPGA每20ms产生一个中断,ARM端内核收到中断后,会向程序发出一个信号,程序的信号处理函数就会将一段mmap后的内存中的数据通过网口发出去,每次的数据量大概有30K。收发数据是新的线程,主线程保持阻塞在accept处。
 目前的问题是,程序在运行一段时间后,会死机,但是进程还在,表现为网口的收发功能异常。下面的??就是gdb直接显示的字符。
 --------------------------------------------------------------------------------------
 正常运行时,用gdb看到的信息为:
 (gdb) info thread
 Id   Target Id         Frame
 * 1    Thread 1319.1319 "zynq_cosw." 0xb6ebda2c in accept () from target:/lib/libpthread.so.0
 2    Thread 1319.1320 "zynq_cosw." 0xb6eb9a2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 3    Thread 1319.1321 "zynq_cosw." 0xb6eb9a2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 4    Thread 1319.1322 "zynq_cosw." 0xb6eb9a2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 5    Thread 1319.1323 "zynq_cosw." 0xb6eb9a2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 6    Thread 1319.1324 "zynq_cosw." 0xb6eb9a2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 7    Thread 1319.1325 "zynq_cosw." 0xb6eb9a2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 8    Thread 1319.1326 "zynq_cosw." 0xb6ebdbac in recv () from target:/lib/libpthread.so.0
 9    Thread 1319.1327 "zynq_cosw." 0xb6eb9a2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 (gdb) thread 1
 [Switching to thread 1 (Thread 1319.1319)]
 #0  0xb6ebda2c in accept () from target:/lib/libpthread.so.0
 (gdb) bt
 #0  0xb6ebda2c in accept () from target:/lib/libpthread.so.0
 #1  0x0001165c in launchSocketServer () at ../src/mts_socket.c:177
 #2  0x00015854 in main () at ../src/zynq_cosw.c:134
 (gdb)
 ------------------------------------------------------------------------------------
 但是出错时,gdb捕获的信息为:
 (gdb) info thread
 Id   Target Id         Frame
 * 1    Thread 1255.1255 "zynq_cosw." 0xb6da2b80 in ?? () from target:/lib/libc.so.6
 2    Thread 1255.1256 "zynq_cosw." 0xb6ebea2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 3    Thread 1255.1257 "zynq_cosw." 0xb6ebea2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 4    Thread 1255.1258 "zynq_cosw." 0xb6ebea2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 5    Thread 1255.1259 "zynq_cosw." 0xb6ebea2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 6    Thread 1255.1260 "zynq_cosw." 0xb6ebea2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 7    Thread 1255.1261 "zynq_cosw." 0xb6ebea2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 8    Thread 1255.1262 "zynq_cosw." 0xb6ec2bac in recv () from target:/lib/libpthread.so.0
 9    Thread 1255.1263 "zynq_cosw." 0xb6ebea2c in pthread_cond_wait () from target:/lib/libpthread.so.0
 (gdb) thread 1
 [Switching to thread 1 (Thread 1255.1255)]
 #0  0xb6da2b80 in ?? () from target:/lib/libc.so.6
 (gdb) bt
 #0  0xb6da2b80 in ?? () from target:/lib/libc.so.6
 #1  0x00000002 in ?? ()
 Backtrace stopped: previous frame identical to this frame (corrupt stack?)
 (gdb) print $pc
 $1 = (void (*)()) 0xb6da2b80
 (gdb) disassemble 0xb6da2b70,0xb6da2b90
 Dump of assembler code from 0xb6da2b70 to 0xb6da2b90:
 0xb6da2b70:    popeq    {r7, pc}
 0xb6da2b74:    mov    r2, #2
 0xb6da2b78:    mov    r3, #0
 0xb6da2b7c:    mov    r7, #240    ; 0xf0
 => 0xb6da2b80:    svc    0x00000000
 0xb6da2b84:    b    0xb6da2b50
 0xb6da2b88:    mrc    15, 0, r1, cr13, cr0, {3}
 0xb6da2b8c:    ldr    r0, [r1, #-1084]    ; 0xfffffbc4
 --------------------------------------------------------------------------------
 主线程为什么会执行到svc去呢?没有新的网络连接,和信号有关系吗?
 出现的概率也不稳定,有时候运行一天都不出现,有时候运行2个小时就会出现。
 麻烦各位帮忙指导看下是什么原因?或者有没有解决的思路呢?程序中的malloc/free函数全部替换为静态的存储了,还是会这样。。。谢啦。
 --
 FROM 111.183.49.*
 
- 中断太频繁了吧?网口响应不过来?
 【 在 sxmman (sxmman) 的大作中提到: 】
 : 程序的功能很简单,FPGA每20ms产生一个中断,ARM端内核收到中断后,会向程序发出一个信号,程序的信号处理函数就会将一段mmap后的内存中的数据通过网口发出去,每次的数据量大概有30K。收发数据是新的线程,主线程保持阻塞在accept处。
 : 目前的问题是,程序在运行一段时间后,会死机,但是进程还在,表现为网口的收发功能异常。下面的??就是gdb直接显示的字符。
 : --------------------------------------------------------------------------------------
 : ...................
 --
 FROM 120.245.132.*
 
- 改成500ms,也会出现这个现象。而且是挂机几个小时才出问题……
 【 在 jiu 的大作中提到: 】
 : 中断太频繁了吧?网口响应不过来?
 --
 FROM 171.113.51.*
 
- 你可以先确定一下是中断引起的,还是以太网这端引起的
 方法也简单,把外部20ms中断,改为内部定时器产生触发,然后在看会不会出现问题,如果还出问题,那就与中断无关了
 
 【 在 sxmman 的大作中提到: 】
 : 程序的功能很简单,FPGA每20ms产生一个中断,ARM端内核收到中断后,会向程序发出一个信号,程序的信号处理函数就会将一段mmap后的内存中的数据通过网口发出去,每次的数据量大概有30K。收发数据是新的线程,主线程保持阻塞在accept处。
 : 目前的问题是,程序在运行一段时间后,会死机,但是进程还在,表现为网口的收发功能异常。下面的??就是gdb直接显示的字符。
 --
 FROM 114.242.29.*
 
- 有道理,我去试试。
 【 在 Rome888 的大作中提到: 】
 : 你可以先确定一下是中断引起的,还是以太网这端引起的
 : 方法也简单,把外部20ms中断,改为内部定时器产生触发,然后在看会不会出现问题,如果还出问题,那就与中断无关了
 :
 --
 FROM 111.181.60.*
 
- socket最常见的问题是关闭线程前没先关闭socket
 --
 FROM 121.69.101.*
 
- 主线程阻塞在accept,其他线程也都在正常工作,并没有线程退出。主线程收到连接创建新的套接字后,作为参数传递给其他线程的,所以应该不存在这个问题吧。
 【 在 pauljoe 的大作中提到: 】
 : socket最常见的问题是关闭线程前没先关闭socket
 --
 FROM 111.183.50.*
 
- netstat查下当前socket情况
 
 传递过去的socket,最后在哪里关闭的
 
 【 在 sxmman 的大作中提到: 】
 : 主线程阻塞在accept,其他线程也都在正常工作,并没有线程退出。主线程收到连接创建新的套接字后,作为参数传递给其他线程的,所以应该不存在这个问题吧。
 --
 FROM 124.64.120.*
 
- 测试内部产生数据了吗
 【 在 sxmman 的大作中提到: 】
 : 主线程阻塞在accept,其他线程也都在正常工作,并没有线程退出。主线程收到连接创建新的套接字后,作为参数传递给其他线程的,所以应该不存在这个问题吧。
 : --
 
 发自「今日水木 on TAS-AL00」
 --
 FROM 221.223.96.*
 
- 放假了,,,到岗后我就测
 【 在 Rome888 的大作中提到: 】
 : 测试内部产生数据了吗
 : 发自「今日水木 on TAS-AL00」
 --
 FROM 223.148.155.*