궁금해서 뒤져봤는데...
델파이나 dbExpress와는 완전히 무관한, 윈도우 시스템 파일의 문제입니다.
일단, 전에 알려드렸던 대로 에러가 아니라 브레이크 포인트에서 걸린 게 맞구요.
다만 그게 유진애비님이 직접 설정한 브레이크포인트가 아니라, 윈도우 시스템 파일인 ntdll.dll에서 하드코딩된 브레이크포인트인 겁니다. (브레이크 포인트는 소스에서 특정 부분에서 코드로 직접 지정할 수도 있습니다) 그러니까 MS의 실수라고 할 수밖에 없는 건데, 윈도우 2000 이상에서 나타난다고 합니다.
따라서, ntdll.dll 내부의 브레이크포인트 코딩이 있는 루틴을 호출하게 되면 개발툴(델파이나 C++빌더 뿐만 아니라 비주얼 C++도 마찬가지) 내에서 디버그 모드로 실행했을 경우 해당 루틴에서 브레이크포인트에 의해 실행이 멈추는 겁니다.
ntdll.dll의 디버그 코드에 의해서 개발툴에 브레이크 포인트가 걸리는 것이므로, 만들어진 프로그램에는 아무런 문제가 없습니다. 그래도 불편하니까, 개발툴에서 회피하려면 ntdll.dll의 어떤 루틴 호출인지를 알아야 할텐데, ntdll.dll에서 브레이크포인트가 걸리는 루틴이 어떤 루틴인지는 정확히 모르겠습니다만...
사례를 보면 애플리케이션의 아이콘을 16만 컬러짜리로 설정했을 때 이 브레이크포인트에 걸리는 것을 봤다는 글이 있더군요. 아이콘 컬러수를 확인해보시고, 16만 등 지나치게 많은 컬러라면 256이나 16컬러로 낮춰서 해보시기 바랍니다.
혹 해결이 안된다고 해도 개발된 애플리케이션에 문제가 있는 것이 아니라 단지 윈도우 개발사의 실수로 인해 개발자가 불편해지는 문제이므로 불만은 MS로 향해주시면 될 듯. ^^
유진애비 님이 쓰신 글 :
: DBExpress를 사용해서 2곳의 서버에 접속을 시키면 프로그램 종료시 에러가 발생하네요.
: 델파이에서 실행하면 에러가 나는데 exe 파일을 실행하면 에러가 나지 않네요.
: 그렇다고 exception이 발생하는것도 아니고..
: 예전에는 잘돌아가던 프로그램인데 포맷후 돌리니까 에러가 나네요.
: 뭔가 세팅 문제인거 같기도 하고..
: 소스는 아래와 같이 DB에 연결하고 다른작업없이 종료만 해도 에러가 발생해요.
: 에러 이미지는 첨부파일로 첨부합니다.
: 답변 부탁드립니다.
:
: (참고로 다른 컴퓨터에서는 정상적으로 동작하네요.. 에궁..)
:
: procedure TForm1.FormShow(Sender: TObject);
: begin
: // DB1 접속
: with DB1 do begin
: ConnectionName := 'OracleConnection';
: DriverName := 'Oracle';
: GetDriverFunc := 'getSQLDriverORACLE';
: VendorLib := 'OCI.DLL';
: LibraryName := 'dbxora30.dll';
:
: Params.Values['User_Name'] := 'id';
: Params.Values['Password'] := 'pwd';
: Params.Values['DataBase'] := 'tns1';
:
: try
: Connected := True;
: except
: Application.MessageBox('DataBase1 접속에 실패하였습니다.', '확인', MB_IconInformation + MB_Ok);
: end;
: end;
:
: // DB2 접속
: with DB2 do begin
: ConnectionName := 'OracleConnection';
: DriverName := 'Oracle';
: GetDriverFunc := 'getSQLDriverORACLE';
: VendorLib := 'OCI.DLL';
: LibraryName := 'dbxora30.dll';
:
: Params.Values['User_Name'] := 'id';
: Params.Values['Password'] := 'pwd';
: Params.Values['DataBase'] := 'tns2';
:
: try
: Connected := True;
: except
: Application.MessageBox('DataBase2 접속에 실패하였습니다.', '확인', MB_IconInformation + MB_Ok);
: end;
: end;
: end;
:
:
: procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
: begin
: DB1.Close;
: DB2.Close;
: end;
|