vc7 0常見除錯問題

2021-04-16 19:01:26 字數 3528 閱讀 7515

1)disable

#pragma warning (disable: 4311 4312)     //指標型別強制轉化,大小不完全匹配

warning c4311: 'type cast' : pointer truncation from 'trinode *const ' to 'long'    

warning c4312: 'type cast' : conversion from 'unsigned int' to 'sac_node_add *' of greater size

注: 64位程式設計時,c4311的警告要處理,c412可以不處理.

#pragma warning (disable: 4244 4267)    //丟失資料,4244為已知型別,4267為64位型別轉化

warning c4244: '=' : conversion from 'long' to 'char', possible loss of data    

warning c4267: '=' : conversion from 'size_t' to 'long', possible loss of data    

#pragma warning (disable: 4996)    //安全警告

warning c4996: 'fopen' was declared deprecated

2)msvcr80d.dll

fat32的檔案系統的時間戳有問題,ntfs分割槽下就沒這個問題.

3)除錯引數選項

a)行號設定: tools->options->text   editor->c/c++,  display: line numbers勾選上

b)除錯變數中使用10進製數字: 在偵錯程式視窗中右擊,16進製制顯示勾去掉.

c)工作路徑: 右擊工程屬性頁property page,general-->output directory;

d)可執行程式: 右擊工程屬性頁property page, debugging-->command;

e)設定預編譯標頭檔案: 現象:fatal error c1010: unexpected end of file while looking for precompiled header directive,

解決方法: 右擊專案工程中的該cpp檔案,property page, c/c++-->precompiled headers,選擇第一項,不使用預編譯標頭檔案;

4)除錯dll

不能進入到dll的source code中,解決方法如下:

一是clean-->rebuild; 二是設定專案依賴關係; 如果不行的話,就有可能是某個檔案的注釋或者其它莫名其妙的原因導致出錯,就對要進入的那個檔案重新分析,最好恢復到上次能進入的頁面看是什麼導致出錯.

5)64位數輸出

_int64 num1;

printf("%i64d", num1);

在gcc可用%ll直接得到64位輸出. typedef long long _int64;

note:vc下不支援long long資料型別,只能使用ms的_int64,下面分別是vc下64的無符號,有符號,16進製制輸出格式

#define host_widest_int_print_dec       "%i64d"     

#define host_widest_int_print_unsigned  "%i64u"

#define host_widest_int_print_hex       "0x%i64x"

6)winsock2.h與windows.h重定義的問題

a)方案1: 在windows.h前加 巨集定義win32_lean_and_mean

#define win32_lean_and_mean    //此巨集用來加快載入windows.h,可以少包含一些較少使用的標頭檔案

#include

b)方案2: 在 windows.h 前先 winsock2.h

7)怎麼使用mfc庫? (輕量級的使用).

假設: 在乙個windows console程式中,後來要使用mfc的字串模板類cstring,但不需增加太多的mfc其它類.

方法:

a)先在vc專案選單-> property -> general -> use of mfc中,選用: use mfc in a share dll;

b)生成乙個stdafx.h,在這個標頭檔案中,只包括

#include // mfc core and standard components

如果使用了socket函式,則

#include //instead of 

//其它需要新增的結構或標頭檔案...

8)error

a)要注意變數的生存週期,在for,while語句裡的變數如果下面還要使用,那麼此變數要提前到語句之前申明;

b)xx)檔案io要注意的問題

a)檔案控制代碼: 數字的檔案描述符,乙個程序能開啟的所有檔案控制代碼總數是有限制的,經測試<1024(系統限制數),此外,程序關閉,所有此程序開啟的檔案控制代碼自動關閉;檔案控制代碼是可重用的,每次得到的檔案控制代碼一定是最小的未用的;所以同一執行緒不斷開啟關閉,可能獲得控制代碼指標是一樣的,而且執行緒id也可能一樣;

b)io的效率: 最好buffsize的大小與檔案塊長相同,如常見的8k一塊的檔案系統,效率最高;

c)檔案共享:核心維護三種資料結構:程序表項,檔案表項,檔案節點結構;此三張表構成了檔案與程序之間的關係.也是理解檔案讀寫加鎖的關鍵; 注意每個程序都在程序表項中占有乙個位置,每個程序都指向乙個程序相關的開啟檔案表項,而每個檔案維護乙個檔案節點結構.所以,各程序獨享的變數是檔案描述符,開啟檔案的檔案狀態標誌,當前檔案偏移位置;而每個檔案的檔案長度,所有者,裝置,磁碟中的位置指標等是各程序共享變數.

d)檔案路徑:用./來表示下層目錄,也可用.//來表示,/是轉義符,表示'/'要用'//'.

e)鎖的技巧:檔案級,位元組級;

f)函式的使用技巧:

不帶快取的io是指系統呼叫函式:read,write,lseek,open,close...

多程序讀同乙個檔案能正常工作,因為每個程序各有自己的檔案表項,當中有自己的檔案位移量;但多程序同寫乙個檔案則可能會出錯,因此要把lseek,write作為乙個原子操作.在windows平台,執行緒與程序在核心是等同的(?),所以多程序操作類似多執行緒.

faq1: 多級指標初始化

a) long* m_ltest1= new long;

b) long** m_cppvalue1;    

m_cppvalue1 = new long* [3];

for(i = 0; i < 3; i++)

c) long*** m_cppvalue;

m_cppvalue = new long**[m];

for(i = 0; i < m; i++)

}//釋放記憶體時的順序剛好相反,先刪除最低層元素空間.

for(i = 0; i < m; i++)

if(m_cppvalue[i]) delete m_cppvalue[i];

}if(m_cppvalue)    delete m_cppvalue;   

解決 vc 2008 無法除錯問題

除錯時出現 tintermediate.manifest general error c1010070 failed to load and parse the manifest.0v 去google尋找 在 feifei zhang at 126的部落格 中找到 1.debug first.exe...

程式除錯問題

問題1 呼叫了matlab的一些lib檔案,修改屬性表中的目錄等,參考opencv配置 問題2 dll檔案 執行,缺少哪個就是將相應的那個新增在工程中 問題3 如果在這個工程中呼叫了opencv封裝的函式,如何進入子函式 將呼叫到的.c h檔案新增在工程中,新增標頭檔案,然後設定斷點,編譯。2.li...

Andorid ADB除錯問題

1 問題 在命令列視窗輸入 adb shell 出現以下結果 daemon not running.starting it now on port 5037 createprocess failure,error 2等。原因 由於c windows system目錄下含有adb.exe檔案,該檔案與...