vc watch窗口查看指針指向的數組(轉)

http://blog.csdn.net/minidick/archive/2009/01/12/3763613.aspx

假設

int *block;

在watch窗口查看block,看到的是block的地址

用block[0],只能看到一個值

可以用   block,10    來同時查看多個值

用(&block[2]),6  可以查看block[2]到[7]

附watch窗口語法規則

  一.格式化數據和表達式賦值語句.  
  常用變量格式化符(表達式的值後跟逗號,接格式化符,如"(int)0xFFFF,d"):  
  d,I:有符號的十進制數.  
  u     :無符號的十進制數.  
  o     :無符號的八  
  x,X:十六進制數.  
  l,h:d,i,u,o,x,X的長前綴或短前綴.  
  f     :有符號浮點數.  
  e     :有符號的科學計數法.  
  g     :有符號的浮點或有符號的科學計數法,用其中較短的一個.  
  c     :單字符.  
  s     :字符串.  
  su   :雙字節字符串.  
  st   :雙字節字符串或ANSI字符串,取決於AUTOEXP.DAT中的Unicode   String設置.  
  hr   :Windows類標記.  
  wm   :Windows消息碼.  
  常用內存轉儲對象的格式化符(用法同變量格式化符):  
  ma   :64個ASCII碼字符.  
  m     :以16進制書寫的16字節,後跟16個ASCII字符.  
  mb   :以16進制書寫的16字節,後跟16個ASCII字符.  
  mw   :8個字長.  
  md   :4個雙精度字.  
  mq   :4個四倍字長的字.  
  mu   :2字節字符(Unicode標準).  
  #     :將指針擴展到指定的數值數目的內存存儲單元上.(#代表一個數字)  
  WATCH窗口允許重新設置數據變量的格式,  
  如:可用BY,DW表達式來定位指針的偏移量;  
  可用&和*運算符,且兩運算符都可直接操作內存地址;  
  甚至可用上下說明符明確指定變量的上下文.  
  總之,所有格式化方法和指定方法在WATCH窗口都有效  
  WATCH窗口是一個完整的表達式求值程序,可以在其中查看任何條件語句.  
  表達式中可用的僞寄存器(可當普通變量進行查看):  
  @ERR:最後一個錯誤值,GetLastError   API返回相同的值.  
  @TIB:當前線程的線程信息塊.(調試器不能處理"FS:0"格式).  
  @CLK:時鐘寄存器.  
  @EAX,@EBX,@ECX,@EDX,@ESI,@EDI,@DIP,@ESP,@EBP,@EFL  
          :Intel   CPU寄存器.  
  @CS,@DS,@ES,@SS,@FS,@GS  
          :Intel   CPU段寄存器.  
  @ST0,@ST1,@ST2,@ST3,@ST4,@ST5,@ST6,@ST7  
          :Intel   CPU浮點寄存器.  
  二.適時編碼  
  許多時候只想對兩斷點間的執行時間有個大致印象,可用@CLK得出兩斷點間所需執行時間(包括調試器佔用的時間).  
  需要輸入兩個@CLK觀察符,第一個是@CLK,第二個是@CLK=0.第二個的目的是重新運行時將定時器清0.  
  時間以微秒爲單位,大多數情況下需要格式化爲毫秒:"@CLK/1000,d".  
  三.在WATCH窗口中調用函數  
  大多數情況下用於執行專門編寫的校驗數據結構,保證數據的相關性的函數.在釋放構件中,從未調用過的函數不會被鏈接,因此不必擔心這類函數會對影響發佈構件.  
  如函數沒有參數,也要求使用括號"()",調用時像用普通函數一樣傳送參數.WATCH右邊將顯示函數返回值.  
  這裏有些限制:  
  1.只能在一個單線程上下文中執行函數.如是多線程程序,將函數輸入到WATCH窗口中檢查結果後應立即從WATCH窗口清除,否則,如調試函數在第二個線程上下文中執行,會立即終止第二個線程的運行.  
  2.調試函數必須在20秒內執行.如執行過程中出現異常,程序會在調試器中中止.  
  3.(常識)只對數據驗證進行內存讀取,如有問題,調用OutputDebugString類的函數.如更改內存或調用API函數----儘管這是可能的,但無法預知可能會發生什麼.  
  只要在WATCH窗口中重新計算表達式,已輸入WATCH窗口的調試函數就會執行:  
  .程序處於運行狀態並觸發某一斷點時.  
  .單步調試某一代碼行或某一指令時.  
  .在WATCH窗口左邊編輯完成調試函數的文本並按下回車時.  
  .在運行程序時出現異常情況,並讓你返回調試器中時.  
  使用調試函數的建議:輸入調試函數並查看值後,立即從WATCH窗口清除;只爲最關鍵的數據結構編寫調試函數;不要更改個別結構的轉儲內像.  
  四.自動擴展自己的類型  
  常見的自動擴展是RECT,輸入RECT型的變量後直接顯示其中的某些數據成員的值.  
  自定義類型擴展時,只需將自己的類型入口加入/MSDev98/Bin目錄的AUTOEXP.DAT文件中.  
  例:  
  擴展CreateProcess()所用到的PROCESS_INFORMATION結構  
  1.檢查調試器將該類型識別爲什麼.將PROCESS_INFORMATION變量輸入WATCH窗口,右擊變量,選擇Properties,在這裏它被標註爲_PROCESS_INFORMATION類型.  
  2.打開AUTOEXP.DAT文本文件,加入擴展入口.語法如下:  
  Type=[text]  
  本例中要查看hProcess和hThread值,故輸入:  
  _PROCESS_INFORMATION=hProcess=   hThread=  
  其中X表示以16進制查看.有個特殊的格式化符<,t>,用於通知調試器輸入最易派生類型的類型名.如B派生至A,只有B有自動擴展規則,則B的自動擴展將會是後面跟隨着類A的自動擴展規則的類型名B.  
  五.Set   Next   Statement命令  
  可以在調試時從菜單運行,但也可在WATCH窗口中直接設置EIP寄存器----小心,可能很容易摧毀程序.在最優化的釋放構件中,最安全的方法是在Disassembly窗口中使用該命令.如代碼在堆棧上創建了臨時變量,更要多加小心.  
  最常用的情況是:在出問題的函數前設置一個斷點,檢查進入的參數,單步調試整個函數;如問題不是重複的,使用Set   Next   Statement設置返回到斷點的執行點,並更改參數.這樣可在一個調試會話中測試多個假設,節省測試時間,但它不能用於所有場合,因爲函數執行會破壞其狀態.  
  另一個常用地點是測試時填充數據結構,如表和數組,可用它輸入額外的數據並查看代碼如何處理--當某些數據條件難於複製時更爲方便.

發佈了18 篇原創文章 · 獲贊 10 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章