2011-11-08 53 views
1

好的,我從SPLASH2中獲得了這個基準,我正在使用它來測試我創建的一個工具。基準測試具有以下結構。這個變量的值如何在這裏修改

typedef struct _interact { 
    struct _interact *next ;   /* Next entry of the list */ 
    Element *destination ;   /* Partner of the interaction */ 
    float formfactor_out ;   /* Form factor from this patch */ 
    float formfactor_err ;   /* Error of FF */ 
    float area_ratio ;   /* Area(this)/Area(dest) */ 
    float visibility ;   /* Visibility (0 - 1.0) */ 
} Interaction ; 

展望代碼,我發現area_ratio從未使用。但最終我發現area_ratio的值不是0,因爲它是在開始階段。所以我在這個變量上放置了一個觀察點,並且令人驚訝地,我指出了一個代碼,它修改了可見性(剛好在area_ratio之下的變量)。

現在我的問題是爲什麼會發生這種情況。 area_ratio如何通過修改知名度進行修改。可能性有哪些?任何線索?我真的很困惑。請注意,我正在64位機器上測試我的程序。也許64位必須做些什麼,但我不知道!

的代碼是這樣的:

/* Create links and finish the job */ 
inter = get_interaction(process_id) ; 
*inter = i12 ; 
inter->visibility = VISIBILITY_UNDEF ; // <---- This is what gdb is pointing to 
+2

可以想象,你已經使用了一個指向'Interaction'的指針,並以某種方式從中減去了'sizeof(float)'字節。這就需要我稱之爲「指針欺騙」 - 例如轉換爲char *'進行減法運算。因此,如果有'交互'指針有任何這樣的詭計,請仔細檢查。 –

回答

2

嗯我知道了!實際上發生的事情是,i12是一個局部變量,它沒有初始化爲0,當我們執行* inter = i12;,所述area_ratioI12被分配給*間並且由於I12area_ratio是隨機的,並且不一定是0,的該值area_ratio被分配給*幀間

順便說一下,現在我已經意識到GDB顯示了目標線下方的一個行號,所以它不是指向行間>知名度= VISIBILITY_UNDEF,但行* inter = i12;

+4

GDB沒有顯示「預計以下的第一行」。而是GDB在修改正在觀察的地址的指令之後立即停止,即在下一條指令上停止。下一條指令可能屬於同一行,下一行,10行後,或100行,這取決於代碼以及它的構建方式。 –

+0

就業俄羅斯,感謝清除混亂。 – MetallicPriest