目前在做一个短信功能的应用
已经到了真机测试阶段
现在面临两个问题
1.有些手机,在发送短信时会莫名重启,并且不是每次都会重启,大概有一半的概率,但短信能发送成功.
发送短信用的是ISMS_SendMsg()接口;
2.有些手机,在读取电话本的时候,只能导入存在手机中的内容,无法读取SIM卡中的内容.
望高手指教,先谢过
------最佳解决方案--------------------
重启有可能是读野指针造成的。可以检查一下内存分配释放有没有什么问题。也有可能是机器上的问题,可以换一台试一下。
------其他解决方案--------------------
先谢谢bsr2009同学
我现在的情况是 在模拟器上看不出任何指针和内存异常的问题 , 并且OUTPUT WINDOW也没有任何错误的提示. 模拟器上也不会死机.
但是真机上有时,是有时...执行到ISMS_SendMsg()就重启了...
在高通论坛上找到过一个相似的帖子,说是回调没有设置好,但是我目前并没看出来自己的回调有什么问题.
重启的几率大概在30%左右
继续求解 希望各位大侠点拨
------其他解决方案--------------------
模拟器没有问题,也说明不了什么
重启肯定是发生了某种异常,可能是硬件异常,也可能是软件异常
除了确认的手机外,其他的手机是否也存在相同的问题?
实机环境下,问题不发生和问题发生时,
ISMS_SendMsg出力参数分别返回什么?
时序上有什么差分?
CB中各变量的生命周期?
....
------其他解决方案--------------------
回楼上
ISMS_SendMsg的返回没有问题
并且虽然重启,但短信能发送成功.
时序用ISHELL_PostEvent处理的
CB.....我也怀疑CB有问题.....但是不知道在哪.....
------其他解决方案--------------------
有JTAG不,debug一下,
重启时,CB调到了吗?如果调到了,看看执行到哪一步时发生重启?
CB关联的上下文的生命周期没有问题?
举个可能不恰当例子,
比如说app终了前,会进行某个处理,这个处理会调到一个CB,
CB中需要利用app的上下文,
受各种影响,有时这个CB被调用的时机可能有点微妙,
可能在app终了前或者app终了后。
如果app终了后,即上下文都释放掉了,那么CB调用时,问题发生
------其他解决方案--------------------
现在的情况是单独给一个号码发送短信是没有问题的, 重启只有在群发的时候才会发生.
所以想问一下关于那个回调
是不是每发一条短信 都要重新设置一个回调 发送完成之后CANCLE掉?
还是设置一个回调 等全部发送完毕之后再注销
------其他解决方案--------------------
void SendSms::StartSend()
{
nSendNow = 0;
nAllToSend=0;
m_nSms = 0;
nCurSend = 0;
n_SmsId=0;
int i ;
for(i = 0 ; i < m_pBase->m_pItemMenu->m_nItemNum ; i++ )
{
if(m_pBase->m_pItemMenu->m_pItemData[i]->nSendFlag == 2 )
{
nAllToSend ++;
}
}
if( m_pBase->m_pToSendSms != NULL)
{
int nTotalLen = WSTRLEN(m_pBase->m_pToSendSms);
if( m_pBase->m_pPhoneInfo->nMaxWord != 0)
{
int a = nTotalLen/m_pBase->m_pPhoneInfo->nMaxWord;
int b = nTotalLen%m_pBase->m_pPhoneInfo->nMaxWord;
m_nSms = (b==0)?a:(a+1);
}
else
m_nSms = 1;
}
nAllToSend = nAllToSend*m_nSms;
// CALLBACK_Init(&m_cb,SendCB,this);
SendAction();
}
void SendSms::SendAction()
{
int k = 0;
boolean bToSend = FALSE;
for(k = 0 ; k < m_pBase->m_pItemMenu->m_nItemNum ; k++)
{
if( m_pBase->m_pItemMenu->m_pItemData[k]->nSendFlag == 2)
{
AECHAR *pwNumber =(AECHAR *)m_pBase->m_pItemMenu->m_pItemData[k]->dwData;
if( pwNumber == NULL)
{
continue;
}
FREEIF(m_pszNumber);
int nLen = WSTRLEN(pwNumber)+1;
m_pszNumber =(char *)MALLOC(nLen);
m_pszNumber = (char *)WSTRTOSTR(pwNumber,m_pszNumber,nLen);
bToSend = TRUE;
break;
}