1. 編譯環境使用VS2008,在調試過程中發現,某個函數的部分代碼沒有正確執行,在這部分代碼處打斷點調試,發現每次調試運行時總是提示斷點無效。出問題的代碼如下,在while(){}代碼塊內部打斷點提示斷點無效。
- INT32 sendLTEMsg(void *pMsg, INT32 iMsgLen)
- {
- INT32 t_iLeft = iMsgLen;
- INT32 t_iRet = 0;
- INT32 t_idx = 0;
- if((NULL==pMsg) || (0==iMsgLen))
- {
- return FALSE;
- }
- while(t_iLeft>0) /*保證將數據全部發送出去*/
- {
- t_iRet = send(g_SockClientLTE, &(((char*)pMsg)[t_idx]), t_iLeft, 0);
- if(t_iRet == 0)
- {
- break;
- }
- else if(t_iRet == SOCKET_ERROR)
- {
- INT32 t_errcode = WSAGetLastError();
- return FALSE;
- }
- t_iLeft -= t_iRet;
- t_idx += t_iRet;
- }/*end of while*/
- return TRUE;
- }
2. 那麼,在什麼情況下會導致運行時斷點無效或不能在指定的位置打斷點呢?
a) 是否編譯時存在調試信息?
需要查看編譯選項,debug or release(說白了就是編譯時的optimizationlevel),debug會存在調試信息。
b) 在編譯完成之後代碼是否有改動?
代碼可能已經和可執行文件不一致,導致打斷點的位置和預期程序執行的位置不一致。如下圖,斷電停在a--的位置,但是程序已經輸出了hello world。
c) 是否將這部分代碼編譯到了目標文件?
比如條件編譯的影響,沒有對這部分代碼進行編譯,當然就不可能打斷點。那麼,如何判斷代碼是否編譯到了目標文件?