最近遇到一個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之前構造,因此斷點無法打到
已經排除特殊字符影響的原因,按照網上的方法是,將文件保存為UNICODE,問題依舊
開始用排除隔離法確定問題位置,最后發現這樣一個規律:
只要在Manager.cpp里構造一個Button
Button insB;
這樣做了以后,斷定必定能起作用。
因此推斷CRT層的全局構造是需要一個鏈表來推動的
因為Manager需要構造,因此CRT肯定會掃描這個CPP對應OBJ鏈接到exe里的段,讓這個段里的全局構造函數都初始化,但是Button因為沒有使用,因此也不會構造。這樣局部掃描應該是出于效率.
解決這個問題還有一個方法就是全部使用靜態鏈接方式,這樣構造代碼都放到最后的exe中,就不會出現這樣的問題