C++斷點(diǎn)無效解決方案
C++作為一款功能強(qiáng)大的計(jì)算機(jī)編程語言,可以幫助我們輕松的完成許多功能需求。不過在這樣的語言編程中,如果處理不當(dāng),同樣也會(huì)出現(xiàn)一些問題。在這里我們就給出了C++斷點(diǎn)無效的解決方案。#t#
最近遇到一個(gè)vs2008 C++中斷點(diǎn)無法工作的問題,具體表現(xiàn)為:
1. 某個(gè)修改后,斷點(diǎn)無法工作,之前版本依然正常
2. 只是某個(gè)文件中斷點(diǎn)無法工作
3. 斷點(diǎn)打在 引用另外DLL中的類對(duì)象A
文件結(jié)構(gòu):
- 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; // 斷點(diǎn)打在這里
- Run.exe
- void main()
- {
- Manager ins; // 實(shí)例化
- }
這里發(fā)現(xiàn)A根本不會(huì)被C runtime在執(zhí)行main之前構(gòu)造,因此造成了C++斷點(diǎn)無效。已經(jīng)排除特殊字符影響的原因,按照網(wǎng)上的方法是,將文件保存為UNICODE,問題依舊。開始用排除隔離法確定問題位置,***發(fā)現(xiàn)這樣一個(gè)規(guī)律:
只要在Manager.cpp里構(gòu)造一個(gè)Button
Button insB;
這樣做了以后,斷定必定能起作用。因此推斷CRT層的全局構(gòu)造是需要一個(gè)鏈表來推動(dòng)的。因?yàn)镸anager需要構(gòu)造,因此CRT肯定會(huì)掃描這個(gè)CPP對(duì)應(yīng)OBJ鏈接到exe里的段,讓這個(gè)段里的全局構(gòu)造函數(shù)都初始化,但是Button因?yàn)闆]有使用,因此也不會(huì)構(gòu)造。這樣局部掃描應(yīng)該是出于效率。
解決這個(gè)C++斷點(diǎn)無效問題還有一個(gè)方法就是全部使用靜態(tài)鏈接方式,這樣構(gòu)造代碼都放到***的exe中,就不會(huì)出現(xiàn)這樣的問題。