歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言斷點調試和編譯問題總結

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

日期:2017/3/1 10:29:31   编辑:Linux編程

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