- 主题:[求助]帮忙指导看下一个程序死机的问题吧
程序的功能很简单,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.*
改成500ms,也会出现这个现象。而且是挂机几个小时才出问题……
【 在 jiu 的大作中提到: 】
: 中断太频繁了吧?网口响应不过来?
--
FROM 171.113.51.*
有道理,我去试试。
【 在 Rome888 的大作中提到: 】
: 你可以先确定一下是中断引起的,还是以太网这端引起的
: 方法也简单,把外部20ms中断,改为内部定时器产生触发,然后在看会不会出现问题,如果还出问题,那就与中断无关了
:
--
FROM 111.181.60.*
主线程阻塞在accept,其他线程也都在正常工作,并没有线程退出。主线程收到连接创建新的套接字后,作为参数传递给其他线程的,所以应该不存在这个问题吧。
【 在 pauljoe 的大作中提到: 】
: socket最常见的问题是关闭线程前没先关闭socket
--
FROM 111.183.50.*
放假了,,,到岗后我就测
【 在 Rome888 的大作中提到: 】
: 测试内部产生数据了吗
: 发自「今日水木 on TAS-AL00」
--
FROM 223.148.155.*
出问题的时候,网络连接并没有断开,而且能挂机测试,能反复断开重连,netstat查看也是连着的。
主线程会把accept返回的套接字当做文件描述符复制一个,然后创建接收发送线程后,把原始套接字关闭,继续回到accept。
【 在 pauljoe 的大作中提到: 】
: netstat查下当前socket情况
: 传递过去的socket,最后在哪里关闭的
:
--
FROM 223.148.155.*
做了类似的测试,不产生新的中断,反复高频率发送旧的数据,测了一个星期,没发现问题……
【 在 Rome888 的大作中提到: 】
: 测试内部产生数据了吗
: 发自「今日水木 on TAS-AL00」
--
FROM 111.181.12.*
确实有点类似,屏蔽了中断,mmap区域不再更新,反复发送重复的数据,没有出现问题了。但是应该读和写是不冲突的吧,芯片内部访问ddr的总线物理是独占的吧。我怀疑中断的驱动问题,或者dma的控制问题可能性大些。
【 在 guoyu 的大作中提到: 】
: 会不会是内存访问冲突呢?发送程序读内存时候,别的程序或者DMA也在读或者写。如果不发送mmap的内容,而是发一些dummy数据,应该就不会死机了吧?
--
FROM 111.183.45.*
是的,中断->驱动响应中断,进行dma->dma完成,驱动向应用发送信号->应用的信号处理函数读取数据,然后网口发出。
现在把dma部分屏蔽,直接中断发送信号,然后反复发数据,这样就会挂。不发信号,也不处理中断,自己反复发送随机数据,这样不会挂。
也已经把malloc函数全部替换为静态数组了。可能还是因为信号会打断其它系统调用?现在不知道怎么继续定位了……
【 在 Rome888 的大作中提到: 】
: 这个好验证
: 你把中断还是打开,正常使用
: 但是发送部分不要用交互来的新数据,就用不变的数据发送,烤机看看出问题不
: ...................
--
FROM 111.183.5.*
有啊,其实中断和信号都没问题,把程序内的一个定时器关了后就好了,还在挂机测,看是哪原因,比较费时间...可能是定时器的信号和驱动的信号之间没处理好
【 在 Rome888 的大作中提到: 】
: 问题咋样了?没结果吗
--
FROM 27.18.87.*