顯示具有 debug 標籤的文章。 顯示所有文章
顯示具有 debug 標籤的文章。 顯示所有文章

星期六, 4月 14, 2012

電腦的時間精度問題

之前寫的簡易校時,是因為發覺系統時間會有不準的情況,但當時並沒有去探討時間不準的情況有多嚴重


直到有支程式需長時間執行的情況下,才發覺此問題的嚴重性! 因為捉取到的資訊是包含了外部主機主機時間與主機寫入時間,久了竟然發覺時間差了2秒以上


最後請出了NTPClock,先取消自動校時的設定,長時間跑下來如下

1.開機約18小時.系統快了約1.5秒
校時18
2.開機約29小時.系統快了統2.9秒
校時29
3.測完2後.系統關機, 重開機後是約 42小時後(從開始計算開始), 系統慢了2.1秒
校時42-跟29間有關機
4.50小時,系統慢了1.7秒
校時50

此情況在WINDOWS 7 家用進階版上測試, 主機為ASUS 家用I7
以此情況來看.在WINDOWS執行時.系統時間會自動變快, 而在關機模式下,系統會變慢!
之後又在其它二台電腦上進行測試.有著相同的結果!
若你要進行測試.請先關閉WIDNOWS中的自動校時設定

星期五, 1月 06, 2012

另人討厭的OLE error 800AC472!

問題: 由程式透過OLE開啟EXCEL,不定時會出現 OLE error 800AC472!


原因: 由程式開啟的EXCEL,若是使用者有對儲存格進入編輯模式(按下F2),即後續程式若再操作EXCEL即會發生

 

解決方式:

  • 不要將EXCEL的VISIBLE設成TRUE(若EXCEL是為了呈現及時計算的資料,此方式不可行)
  • 由程式測試是否為可更新模式 請參考MSDN討論區, 但此方式我在OFFICE 2007試不出來! 且使用者有可能是按下功能列上的儲存而造成相同錯誤

後記: 不知道為什麼不提供READONLY或ENABLED可供操作! 雖然可以在程式中操作表格是否可以異動,但程式若需寫入時,還是需要將表格變成可異動,只需要在短短的這段時間內,使用者按下F2一樣破功!

星期三, 12月 15, 2010

debugging with “application failed to initialize properly (0xc0000235). Click OK to terminate.”

Exception Message: "應用程式正常初始 (0cx0000235)失敗。請按下[確定]終止應用程式。"

0xc0000235

Developer Tools: C# C++ Delphi etc..




Solutions:Uninstall Avira Antivir 9 OR upgrade to Avira Antivir 10

Avria AnviVir 9 version info:

Version Information

Version Information2

星期三, 3月 24, 2010

捉出程式中的Memory Leaks(物件未被釋放)

在Delphi的環境中.因為沒有全面的gc系統,所以讓系統不穩定的一個潛在原因為”物件建立後未被釋放”! 程式可能一開始都很正常,但經過反覆操作,久了後常因為記憶體(heap)爆了,而發生錯誤,此種未被正常釋放的物件行為可以稱為 MemoryLeaks

要排除這樣子的狀況,首先要有良好的寫作習慣,使用try finally 來釋放物件,例如


with TStringlist.create do

try

finally

  free;

end

 

但在一個複雜的系統中,若要找出像這樣子的潛在問題,不可能拿出所有的code一行一行程式去review‧此時就需要用程式或工具的協助

  • 導入要需要付費的 Eureka exception log
  • 使用Delphi 內建的debug功能

使用delphi內建的debug功能,是個簡單又實惠的做法,只需要將 MemoryLeaksOnShutdown 變數設成true即可(在system)

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TStringList.Create do
  begin
    AddObject('1',TLabel.Create(nil));
    AddObject('2',TLabel.Create(nil));
    AddObject('3',TLabel.Create(nil));
  end;
  with TButton.Create(nil) do
  begin
    Parent := Self;
    Visible := True;
  end;
end;

 

 

當button1被click過後.結束程式時即會彈出如下的訊息

Delphi.ReportMemoryLeaksOnShutdown

星期三, 5月 27, 2009

Fixed Delphi 2009 TClientDataSet locate method (filter) at widestring problem

I have fixed "Clientdataset can't locate TWideStringField" problem!

I find then problem at TExprParser! You solve the problem Step by Step .

  • Add a new class inheritance from TClienDataSet

  • override Locate Method!

function TBearClientDataSet.Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
begin
 DoBeforeScroll;
 Result := LocateRecord2(KeyFields, KeyValues, Options, True);
 if Result then
 begin
  Resync([rmExact, rmCenter]);
  DoAfterScroll;
 end;
end;

  • Add private LocateRecord2--Copy From LocateRecord and Change TExprParser to TExprParser2
  • Write TExprParser2

Some Code..

function TFilterExpr2.PutConstant(Node: PExprNode): Integer;
begin
 Result := 0;
 case Node^.FDataType of
  ftString, ftFixedChar, ftGuid: Result := PutConstAnsiStr(AnsiString(Node^.FData));
  ftWideString, ftFixedWideChar: Result := PutConstUnicodeStr(UnicodeString(Node^.FData));
..
end.


function TFilterExpr2.PutConstAnsiStr(const Value: AnsiString): Integer;
var
Str: AnsiString;
Buffer: array[0..255] of Byte;
begin
 if Length(Value) >= SizeOf(Buffer) then Str := Copy(Value, 1, SizeOf(Buffer) - 1)
 else Str := Value;
 FDataSet.Translate(PAnsiChar(Str), PAnsiChar(@Buffer), True);
 Result := PutConstNode(ftString, @Buffer, Length(Str) + 1);
end;

function TFilterExpr2.PutConstUnicodeStr(const Value: UnicodeString): Integer;
var buffer: array of word; Len : Integer;
begin
  Len := Length(Value);
 SetLength(buffer, Len + 1);
 buffer[0] := Len * 2;
 if Value <> '' then Move(Value[1], Buffer[1], Len*2);
 Result := PutConstNode(TFieldType(ftUnknown), @buffer[0], (Len+1)*2);
 SetNodeOp(Result, 0, $1007);
end;

星期三, 7月 02, 2008

使用Debugging Tools for Windows進行windows當機分析

最近電腦常會發生當機(藍屏),有時來不及看就重新開機了,嚐試重新安裝windows XP,但改善狀況有限,此時想起了之前看到的debug工具,Debugging Tools for Windows與Windows Symbol Packages。

依照之前的理解是可以進行windows系統核心的deubg(要透過另一台電腦),但在沒有二台電腦下,也沒有二台電腦所需的連線設備下,猜想此工具應可以進行dump檔的分析。

此時找到了微軟關於此debug工具的網頁,下載了Debugging Tools 與Symbol Packages,安裝時均使用設目錄安裝,開啟了windbg,bingo真的有需要的功能

  1. 進到了WinDbg
  2. File / Symble Files Path進行symble路徑指定,其實可以不需要像網頁所說的從網路下載,只要把路徑設到 C:\WINDOWS\Symbols 可以加快分析(ps 嚐試連上 http://msdl.microsoft.com/download/symbols 也無法連線)
  3. File /Open Crash Dump 打開當機時windows dump下來的檔案進行分析, dump的資訊存放在 C:\WINDOWS\Minidump, 副檔名為dmp

此時分析後的資訊如下

Loading Kernel Symbols
..................................................................................
Loading User Symbols
Loading unloaded module list
.....
Unable to load image iP293x.sys, Win32 error 0n2
*** WARNING: Unable to verify timestamp for iP293x.sys
*** ERROR: Module load completed but symbols could not be loaded for iP293x.sys
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck 1000007E, {c0000005, a8653b8b, ba507950, ba50764c}

Probably caused by : iP293x.sys ( iP293x+14b8b )

MODULE_NAME: iP293x

FAULTING_MODULE: 804d8000 nt

DEBUG_FLR_IMAGE_TIMESTAMP:  480732d9

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx"

FAULTING_IP:
iP293x+14b8b
a8653b8b 8b86c8000000    mov     eax,dword ptr [esi+0C8h]

EXCEPTION_RECORD:  ba507950 -- (.exr 0xffffffffba507950)
ExceptionAddress: a8653b8b (iP293x+0x00014b8b)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 000000c6
Attempt to read from address 000000c6

所列出的資訊還蠻詳細的,可以得知發生錯誤應是在iP293x.sys ,查看了檔案系統資訊"iPassion Serial Bus Camera Driver",猜想應是webcam的驅動程式, 當下重新安裝了相關的驅動程式,下回若還是當機的話,只能回Yahoo拍賣詢問一下賣家是否有更版了!

星期五, 5月 25, 2007

DEBUG 模式下,中斷點失效,提示訊息 "The breakpoint will not currently be hit. No symbols have been loaded for this document"

我常使用的debug模式為,把程式執行起來,再用選單上的 debug/attatch to process,選擇自己要debug的應用程式,這樣子雖然無法享受所有vs2005 提供的所有debug功能,但反應速度是最快的!

有天,有支應用程式突然無法停在中斷點,斷點一直提示The breakpoint will not currently be hit. No symbols have been loaded for this document,明明以前都可以的,苦惱啊!!檢查了好久整個設定都對,最後發現是他attatch時的程式類型別別錯誤,一共有二種排除方式,在這提供其中一項

attatch to process時,點select選擇到對的應用程式類型,因為我的應用程式有使用到資料庫連結,所以我選擇了 managed code 跟 T-SQL Code,即排除了一定要由ide中點run 慢到讓人吐血的debug方式

星期二, 2月 13, 2007

錯訊排除 : Exception has been thrown by the target of an invocation. The original message is 'Index and length must refer to a location within the string.

中文 : 索引和長度必須參考字串中的位置。\r\n參數名稱: length

英文 : Exception has been thrown by the target of an invocation. The original message is 'Index and length must refer to a location within the string. Parameter name: length'.


原因:String.Substring(0, 4)要取用的結束長度比原字串還長

星期日, 11月 26, 2006

Visual studio 2005 數個DEBUG的技巧

  1. 遇到異常的錯訊.不知道死在那的Debug方式
  2. 享受Debug的樂趣,且遇到exception時,不會讓程式程式無法繼續往下Debug。
  3. 組件(非執行檔)的DEBUG方式

1.有時在DEBUG會跳出錯誤訊息,但是中斷點卻沒有停留在程式錯誤的地方,或是程式的錯誤讓你感到很無厘頭時的處理方式。

  • 把你主程式與你認為有錯的組件,進到project option中,把 Enabled unmanaged debugging打勾
  • Menu/debug/exception,把所有的類型的打勾(或你想看的類型自行打勾),若下回要回覆原來的預設值只要點選reset all即可
  • 再重編專案進入debug即可

2.有時程式中會有一些自行引發的例外,他可能是你有處理的或是無聲的例外,若在RUNTIME執行時並不會有訊息,但在DEBUG MODE時只要遇到就都過不去了!讓你無法往下做DEBUG。

  • 先重編你的專案
  • 自行點選執行檔執行你要偵錯的程式
  • 點選vs2005上的Debug/Attach to process(若有多個主程式那可以用CTRL+MOUSE做多選)
  • 按Attach即可,此時再去RUN你的程式
  • 快快樂樂的去DEUBG吧!

3.組件(非執行檔)的DEBUG方式

  • 方法同2

星期一, 8月 21, 2006

"需要有物件參考才能使用非靜態欄位、方法或屬性"的問題排除

之前在提到即時運算視窗時,會在呼叫非靜靜態方法時出現"需要有物件參考才能使用非靜態欄位、方法或屬性",其實他就是告訴你非static的方法,需要有該物件才可以叫用!

若你在程式中直接使用
public class Test
{
 public static void A()
 {
  B();
 }
 public void B()
 { 
 }
}
你一樣會在編譯時,發生同樣的錯訊,非靜態的方法,一定要透過物件本身去呼叫他
例如
Test t = new Test();
t.B();

由此可以知道上回的命令若要測試~就新增一個靜態的方法如下
static int TestSum(int i1, int i2)
{
 Test t = new Test();
 return t.sum(i1, i2);
}
叫用時直接使用 ? Test.TestSum(1, 2)即可~

星期六, 7月 22, 2006

Visual Studio 中的即時運算視窗

要測試一段程式碼的正確性時,在delphi中最常使用的是放一個button掛上click事件,然後寫一些code去測試他,然而在vs中的即時運算視窗,即可以在不寫額外code的狀況下,得知結果。

例如如下的code

public class Test
{
 static int staticsum(int i1, int i2)
 {
  return i1 + i2;
 }

 int sum(int i1, int i2)
 {
  return i1 +i2;
 }
}

當你想直接測試staticsum運算結果正不正確時,請直接在運算視窗中打入
? Test.staticsum(1,10) 而系統會先編譯專案,然後執行告知結果為11。

若要調用且測試sum的結果.打入
? Test.sum(1,10)
此時會到一個錯訊"需要有物件參考才能使用非靜態欄位、方法或屬性 'BearDebugTest.Test.sum(int, int)'",明確的告訴你只能調用靜態的方法,不過這個限制倒是可以蠻輕易的"破解"他,換另一個角度去切入就好了~ 自己試一下吧~~

其實跟"運算視窗"應算是"命令視窗"的簡化版,只是將能做的事情單純化! ^^

貼上文章後,發現blogger笨笨的,把我縮排的空白都吃掉了,有人能告訴我有什麼tag可以保持對code的原來樣式的支援嗎?要不然一個個的去打全型的空白是很吃力的事!