系统出异常了,会给你提示一堆调用堆栈,不过基本上没有 什么用处,
要找问题还得自己动手。
前两天编译new3的7603驱动,千辛万苦编译出来了,能启动系统,客户端也能连上,但是客户端一跑iperf3连到其他设备就异常,不过iperf3直接测无线路由没有问题,初步怀疑是nat模块的问题,重新关掉hnat,现象一样,没有办法,只有调试了。
系统提示softirq异常,稍微百度了一下,是说软中断不为空,这个时候进入可能就有问题。
关键是怎么找到调用?
首先看异常时调用堆栈,
0x8xxxxxxxxxx
0x9xxxxxxxx
......
先找出各个模块地址空间:cat /proc/modules
rt_timer_wdg 704 0 - Live 0x9b168000
......
nfnetlink 2176 1 ip_set, Live 0x9ab5e00
mt76x3_ap 1731728 1 - Live 0x9a000000
看到76x3的地址是9a000000,找出堆栈里面的地址主要有两个
0x9ad7dbc...
0x9b1d40..
nm mt76x3_ap.ko > ko.txt
在txt中查找相应的地址,注意要关注地址前面的,不会完全一致
最后定位在两个func:
RTMPSendPackets-->wdev_tx_pkts
应该就是wdev_tx_pkts中出了异常,看了几遍,看不出问题,只有加debug info定位了
用DBGPRINT最后定位在
if(ra_sw_nat_hook_tx!= NULL)
{
unsigned long flags;
RTMP_INT_LOCK(&pAd->page_lock, flags);
ra_sw_nat_hook_tx(pPacket);
RTMP_INT_UNLOCK(&pAd->page_lock, flags);
}
用了LOCK、UNLOCK,看IDE标的颜色不一致,屏蔽掉,跑起来没异常了,就是这里的问题,但是速度很慢,怀疑是ra_sw_nat_hook_tx的问题,注释掉,再跑一次,基本上OK了。
成功找出问题,但是没有分析出原因,以后再弄。