プログラムが勝手に終了してしまう

解決


サトウ  2013-06-22 02:51:32  No: 44717

次の現象の解決方法が分からず困っています。

環境は、Win-XP/SP3 DelphiXe3Pro ADO 2.8 Firebird 2.5.0.2607_7(Embeded)
Firebird ODBC 2.0.1.152です。

Desktop DB  Appを作成しています。レコード件数は今5万件程度です。

Projectは項目ごとの入力画面と、DBGridのデータ表示画面とDataModule持っています。
PF9で実行すると、データ表示画面にレコード内容が表示されるが、
そのまま操作を加えないでいても、約1分後にメニュー「プログラムの終了」
をしたような状況に陥いり、突然終了してしまします。
エラー表示などはありません。

関係するか分かりませんが、終了する10秒前ほどに新たなスレッドが開始しています。

プログラムを少づつ変更しながら、確認をしているのですが、どのようなときに終了するのかつかめていません。なんとなくDBの関連ではないかとは疑っています。
ときどきは1分経過しても終了しないこともあります。

Win7環境でも確かめてみましたが、Xpの時と同じように突然終了してしまいます。

このような場合、どこでプログラムが終了しているかを探る方法はないでしょうか?


TS  2013-06-22 03:14:11  No: 44718

>そのまま操作を加えないでいても、約1分後にメニュー「プログラムの終了」
>をしたような状況に陥いり、突然終了してしまします。
普通のエラーの場合エラー表示が出ると思います。
ですが、メモリーの不正書き込みが行われると訳の分からない時に上記の
状態になります。

どこかでメモリーを確保している所はありませんか。
古いDelphi2009以前では正常に作動していてもDelphiXe3ではデータの形が
変更されていてそれに合わせて書き直さないといけない事があります。


サトウ  2013-06-22 05:32:22  No: 44719

TSさんありがとうございます。

画面が表示されるまでは、ADOConnection,ADOTable,ADOQueryのOpen、DBGridのItems設定程度のことしかやっていないし、Propertyもほとんど初期状態です。
メモリーへの不正書き込みだとすると、PF8やPF7で追っていたときにある特定の箇所で終了してしまうのでは? PF7やPF8で追ってみたのですが「ここだ」というところが見つかりません。

DBは最初SQLiteをDBExpressで使っていましたが、第1レコードにNull項目があると、その項目がWideMemoFieldに判断されるのをきらって、FireBirdに置き換えているうちにはまってしまいました。

データの型の違いとはAnsiとUniCodeの違いでしょうか?  
DBはUTF8を指定してますし、文字列型は単純にStringにしてます。
SQLiteを使っていたときは、このような現象はありませんでした。

終了の状況をイベントログペインでみていると、なにかのClassのスレッドが関係しているような気がしますが、どのスレッドがどのクラスに関係しているか判断できないのでしょうか?


igy  2013-06-23 03:45:37  No: 44720

>PF9で実行すると、データ表示画面にレコード内容が表示されるが、

試しに、

・新規プロジェクトで、データ表示画面にレコード内容が表示するだけのプログラムを
  作成し、同じ現象が起きるか確認。
  
・ADO 2.8、Firebird ODBC 2.0.1.152 ではなく、IBX を使って、
  新規プロジェクトで、データ表示画面にレコード内容が表示するだけのプログラムを
  作成して、同じ現象が起きるか確認。

などしてみるのも、よいかもしれません。


サトウ  2013-06-25 06:54:02  No: 44721

igyさんありがとうございます。

ConnectOptionsをcoAsyncConnectにしていましたが、coConnectUnspecifiedに変更したら落ちなくなりました。
しかし、確認の為coAsyncConnectに戻したら、今度は落ちなくなりました。
まったく分かりません。

ADO、ODBCをもう少し勉強してみます。
また再現するかもしれませんが、とりあえず解決ということにします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加