2009-12-28 64 views
0

我有一個核心文件,我正在檢查。我只是難以理解可能的原因。這是行爲:這個奇怪的崩潰的任何可能的解釋?

extern sampleclas* someobj; 
void func() 
{ 
    someobj->MemFuncCall("This is a sample str"); 
} 

我的崩潰是在MemFuncCall中。但是當我檢查覈心文件時,someobj有一個地址,比如abc(這個地址被正確初始化並且沒有被破壞),這與函數stacktrace中的這個指針是不同的:sampleclass :: MemFuncCall(this = xyz,「This is a sample str「)

我假設這個指針總是和someobj的地址一樣,即abc應該總是等於xyz。 這兩個地址可能不同的可能情況是什麼? Fyi,這個程序是單線程的。

+0

MemFuncCall在做什麼?如果它正在接受一個char *,並且你正在寫它可能會導致問題,因爲char *參數指向一個靜態字符串。 – asm 2009-12-28 20:15:08

+0

@Andrew Myers它只是採取const char *。 – VNarasimhaM 2009-12-28 20:27:08

回答

1

這是可能的。也許某種緩衝區溢出?也許調用約定(或通常的定義)對於MemFuncCall來說是錯誤的(編譯的頭文件與編譯MemFuncCall時的頭文件不匹配)。

很難說。 但由於這是單線程,我會嘗試以下技術。通常應用程序重新執行之後,應用程序中的內存佈局是相同的。因此,在調試器下啓動應用程序,立即停止並在地址0xabc和0xxyz上放置兩個內存斷點。一旦有人修改了這個記憶,你很可能會觸發斷點。也許堆棧跟蹤會有幫助?

+0

發現問題,這是因爲緩衝區溢出。 – VNarasimhaM 2010-01-11 21:34:49

2

船舶優化可以使調試器中的東西顯得很奇怪。以調試模式重新編譯(優化關閉)和回購。

另一種可能的解釋是,如果調用約定(或通常的定義)對於MemFuncCall是錯誤的(編譯的頭文件與編譯MemFuncCall時存在不一致)。不過,你必須盡力去解決這個問題。

+0

所以當優化時,*這將是一個不同的對象?問題是我無法回購它或客戶端。 – VNarasimhaM 2009-12-28 20:14:46

+0

最有可能。特別是,C++調用約定通常使用寄存器來傳遞「this」(例如,'ECX' for VC++'__thiscall'),當它不再被使用時,它立即在方法主體中立即覆蓋。 – 2009-12-28 20:15:08

+0

@VaarasimhaM:不,它不會是一個不同的對象。在這一點上,可能只是用來存儲被調用方法中'this'指針的內存位置或寄存器不再被使用,並且被其他需要存儲的值覆蓋。 – 2009-12-28 20:16:31

0

我能想到的一件事是vtable的腐敗。

1

在多重繼承的情況下,this指針可以是從指針到的「真實」對象不同:

struct A { 
    int a; 
    void fa() { std::cout << "A::this=" << this << std::endl; } 
}; 

struct B { 
    int b; 
    void fb() { std::cout << "B::this=" << this << std::endl; } 
}; 

struct C : A, B { 
}; 

int main() { 
    C obj; 
    obj.fa(); 
    obj.fb(); 
} 

這裏內部obj.fa()this將指向的objA部分,而內fb()它將指向B部分。所以this指針可以在不同的方法中有所不同,也可以不同於&obj

作爲崩潰的一個原因可能是someobj之前被刪除,並且指針不再有效。

+0

我懷疑someobj是否被刪除。當我做某事時,一切都看起來正確。但是,如果我這樣做的話,這個功能就是錯誤的。 – VNarasimhaM 2009-12-28 20:26:29

1

由於指針someobj是在外部定義的,因此您的編譯單元之間可能存在一些不一致之處。嘗試清理一切並重建項目

相關問題