歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言斷點調試和編譯問題總結

1. 編譯環境使用VS2008,在調試過程中發現,某個函數的部分代碼沒有正確執行,在這部分代碼處打斷點調試,發現每次調試運行時總是提示斷點無效。出問題的代碼如下,在while(){}代碼塊內部打斷點提示斷點無效。

  1. INT32 sendLTEMsg(void *pMsg, INT32 iMsgLen)  
  2. {  
  3.     INT32 t_iLeft = iMsgLen;  
  4.     INT32 t_iRet = 0;  
  5.     INT32 t_idx = 0;  
  6.     if((NULL==pMsg) || (0==iMsgLen))  
  7.     {  
  8.         return FALSE;  
  9.     }  
  10.     while(t_iLeft>0) /*保證將數據全部發送出去*/  
  11.     {  
  12.         t_iRet = send(g_SockClientLTE, &(((char*)pMsg)[t_idx]), t_iLeft, 0);  
  13.         if(t_iRet == 0)  
  14.         {  
  15.             break;  
  16.         }  
  17.         else if(t_iRet == SOCKET_ERROR)  
  18.         {  
  19.             INT32 t_errcode = WSAGetLastError();  
  20.             return FALSE;  
  21.         }  
  22.         t_iLeft -= t_iRet;  
  23.         t_idx += t_iRet;  
  24.     }/*end of while*/  
  25.     return TRUE;  
  26. }  

2. 那麼,在什麼情況下會導致運行時斷點無效或不能在指定的位置打斷點呢?
a) 是否編譯時存在調試信息?
    需要查看編譯選項,debug or release(說白了就是編譯時的optimizationlevel),debug會存在調試信息。
b) 在編譯完成之後代碼是否有改動?
    代碼可能已經和可執行文件不一致,導致打斷點的位置和預期程序執行的位置不一致。如下圖,斷電停在a--的位置,但是程序已經輸出了hello world。

c) 是否將這部分代碼編譯到了目標文件?
    比如條件編譯的影響,沒有對這部分代碼進行編譯,當然就不可能打斷點。那麼,如何判斷代碼是否編譯到了目標文件?

Copyright © Linux教程網 All Rights Reserved