C++作為一款功能強大的計算機編程語言,可以幫助我們輕松的完成許多功能需求。不過在這樣的語言編程中,如果處理不當,同樣也會出現一些問題。在這裡我們就給出了C++斷點無效的解決方案。
最近遇到一個vs2008 C++中斷點無法工作的問題,具體表現為:
1. 某個修改後,斷點無法工作,之前版本依然正常
2. 只是某個文件中斷點無法工作
3. 斷點打在 引用另外DLL中的類對象A
文件結構:
- Core.dll
- A.cpp
- class A
- {
- public:
- A( )
- {
- printf("constructor of a");
- }
- }
- UI.dll
- Manager.cpp
- class Manager
- {
- public:
- Manager( )
- {
- printf("constructor of Manager");
- }
- }
- Button.cpp
- A ins; // 斷點打在這裡
- Run.exe
- void main()
- {
- Manager ins; // 實例化
- }
這裡發現A根本不會被C runtime在執行main之前構造,因此造成了C++斷點無效。已經排除特殊字符影響的原因,按照網上的方法是,將文件保存為UNICODE,問題依舊。開始用排除隔離法確定問題位置,最後發現這樣一個規律:
只要在Manager.cpp裡構造一個Button
Button insB;
這樣做了以後,斷定必定能起作用。因此推斷CRT層的全局構造是需要一個鏈表來推動的。因為Manager需要構造,因此CRT肯定會掃描這個CPP對應OBJ鏈接到exe裡的段,讓這個段裡的全局構造函數都初始化,但是Button因為沒有使用,因此也不會構造。這樣局部掃描應該是出於效率。
解決這個C++斷點無效問題還有一個方法就是全部使用靜態鏈接方式,這樣構造代碼都放到最後的exe中,就不會出現這樣的問題。