こんにちは、当方あるProgramを使っているユーザーです。そのProgramで以下のような
メッセージがたまにでて困っています(めったに出ないため検証も難しく)。そのProgram
を作成依頼している部署もなぜこのエラーメッセージがでるのか分からないようで、、
出来れば、その作成依頼している方々にここら辺をチェックしてみてもらえないか?”
といいたいのですが、このメッセージが出る場合、どういう所をみるのが良いのか、ご
教授願えないでしょうか(頂いた文はそのまま、Programが分かる人に伝えます)。 素人
ですが、とにかくなんとかしたく、ここに質問してみる事にしました。
タイトルバー:Microsoft VisualC++ Debug Library
メッセージ欄:Debug Assertion Failed!
Program:C:\Program Files\Microsoft Office\Office10\EXCEL.EXE
File:strcore.cpp
Line:344
For information on how your program can cause anassertion
failure,see the Visual C++ documentation on asserts.
ここで、Abort、Retry、Ignoreが出てきて、Ignoreを押すと、Programは何も無かったか
のように、また走ります。
当方 Visual C++ 6.0 SP6
「Microsoft Visual Studio\VC98\MFC\SRC」の
「STRCORE.CPP」の 344行目付近
---------------------------------------------
const CString& CString::operator=(LPCTSTR lpsz)
{
ここ→ ASSERT(lpsz == NULL || AfxIsValidString(lpsz));
AssignCopy(SafeStrlen(lpsz), lpsz);
return *this;
}
-----------------------------------------------
このアサートが発動したメッセージのようです
ただしこれはVC6のMFCを使用している場合であって
コンパイルバージョン、MSの提供ソースバージョンによって多少
異なってきます
尚このソースを信じた場合、NULL(ヌル文字)以外がここを通過することが
期待されているのにNULL(ヌル文字)が来しまった、
またはNULLポインタが来てしまったことを意味します
CStringというクラス、関数を使用している所をデバック対象にしてみてください
と言うことになると思います
Debugビルドしたのを配布しているのか・・
ASSERT のメッセージボックスがでるのですよね?
VC上で実行させているのなら、自分はいつも以下の手順で確認してます。
1.ブレークさせる
2.コールスタックで、どの処理から呼ばれて現状に至っているか確認
VC上で動いてなくても Debug で作成したプログラムなら
ASSERT が出た時点でVC起動してプロセスにアタッチすれば
デバック出来そうな気もしますが、試したことはないです。
> Debugビルドしたのを配布しているのか・・
「部署」とのことですので、自社内の人間にベータを使わせて評価/テスターにしているとか。
それなら MS のライセンス的にも問題ないはず。
>> Debugビルドしたのを配布しているのか・・
>「部署」とのことですので、自社内の人間にベータを使わせて評価/テスターにしている
>とか。
そうであればいいのですが、文面からはそうは読み取れませんでした。
むしろ作成者がReleaseビルドの存在又は意味を知らない可能性の方が高いかと
>それなら MS のライセンス的にも問題ないはず。
ライセンスの件は同意見です。
どういう所ではなく、どういった操作、扱ったデータの情報が必要です。
チェックするなら、変数チェックを至るところに追加するしかないのでは?
うーん、せっかくAssertionが出ているのに生かせないというも困った状態ですね。
いきなりプログラムが終了するような事態に比べれば数倍マシなはずなんですが。
皆さんも言われていますが、Debug版で動かしているようなので
実際にデバッガーで追いかけさせた方がよいと思います。
再現方法がわからないなら起こった時にやった操作を出来る限り提示して
やってもらうしかないです。
デバッガーで追いかける場合、正にその状態にしてやらないと追いかけられませんから。
woodさんの指摘した場所で出ているのであれば、
出ている箇所はCStringクラスの代入演算子の部分ですから
多分、プログラム中で文字列の設定を行おうとして起きているのでしょう。
CStringに引き渡したポインタがNULLでなくて、かつ中に保持している内容が
文字列として適当でない値が入っているために出ているのではないかと思います。
バイナリデータなのに無理やりキャストして渡したりすれば出るのでは?
もしくはちゃんと初期化されていないバッファをCStringに代入しようとしているとか。
いずれにせよ、不具合だと思うので開発者にきちんとデバッグさせないと駄目ですね。
EXCEL.EXE の中で死んでるね。
Excel マクロから呼ばれる DLL 関数の中で MFC を使ってるのかな?
wood さん曰く、
>尚このソースを信じた場合、NULL(ヌル文字)以外がここを通過することが
>期待されているのにNULL(ヌル文字)が来しまった、
>またはNULLポインタが来てしまったことを意味します
これ、ちょっと違うんじゃないかしら?
NULL か、または、有効な文字列なら正常なのであって、
ここでエラーになるのは、WinNT系(NT/2000/XP...) で文字列が読み取りアクセス
不能なメモリ領域を指している場合、って気がするんだけど、間違ってますか?
例えば、NULL終端のない BSTR/VARIANT 文字列へのポインタを CString に代入
してたりするとこんなエラーになるかも、って私は思います。
おおっ、たしかにEXCELですね。(よく見てなかった。(^^;)
同じような内容ですぐ上に私も書いてますが、
EXCELで起きているって事になると指摘されている通り、
マクロからDLLでも呼んでるんですかねぇ?
アサーテーションの内容からだけ見ると単純なコーディングミスでも起こりそうです。
めったに通らないルートで流れた時にローカル変数が初期化されないまま、
CStringの変数に突っ込まれたとか。
ただ、EXCELマクロって事になると、やさんの指摘が有力候補ですね。
> むしろ作成者がReleaseビルドの存在又は意味を知らない可能性の方が高いかと
かなり、こまってます さんの環境が該当するかはわかりませんが、
確かに世間一般では意外と有りそうな気も.......。
個人的に云々やっているならそういうレベルも許されると思うんですが、
例え、内製でも業務でやるのであれば、そのレベルでもの作りをするというのは
かなり危険な気がします。そのプログラムを使う用途が良くわからないので
外しているかもしれませんけれど、そのプログラムの所為で外部に迷惑をかけたりしたら
洒落になりませんからね。
練習でやらせているのであれば、少なくともわかる人間がフォローに付くべきだと思います。
かなり、こまってます さんの内情がわからないので何とも言いかねますが、
業務でやるのであれば、ソフト開発を甘く見ていないかなぁと心配になりますね。
皆さん、いろいろと、ご教授有難うございます。やさん、PATIOさんのおっしゃる
通り、EXCELマクロとDLLを用いています。皆さんがご指摘の事をもう少し分かるものへ
伝えて見ます。私はそのProgramを単純にひとつのツールとして利用する最終利用者なの
ですが、この不具合を訴えてもなかなか、解決しないもので。。。少しでも何か進めら
れたらと思い確認してみました。なお、本問題、以前頻発したのですが、Officeのパッ
チを適応したら、ほとんど出なくなったので、安心していましたが、昨日1ヶ月ぶりく
らいに発生して、問題が解決していなかった事に気づき、あわててるしだいです。
ありがとうございます。
http://www.net24.ne.jp/~kenji/bbs/wforum.cgi?mode=allread&no=1980&page=0
は別の方でしょうか?(名前が違うだけで内容はほぼ一緒)
もし同じ方なら、マルチポストすることをここで伝えるべきでは。
(違う方の場合は、疑ったりしてスイマセン)
Bluesさん、こんにちは。ご指摘の件は、私ではありません。今確認してみましたが、本
文は消えてましたね。しかしもしかしたら、私が本件を伝えて考えて頂くようお願いし
ている方々の誰かが、質問したのかも知れません(質問内容が消えていたので、判断でき
ませんが)。もし、そうだとしたら、すみません(一応、確認してみます)。ご連絡有難う
ございました。