こんにちは。
プログラムのデバッグ中に、ある変数の値が変化した箇所で
実行を中断させたいと思います。
VB6 の頃には、ウォッチ式の追加で
「式の内容が変化したときに中断」というのがあり
デバッグがしやすかったのですが、
VB2005 ではどのようにすれば出来るのでしょうか。
ブレークポイントを設定し、そのブレークポイントのアイコンを右クリックすればブレークする条件などを設定できます。
ただ、Express Edition では無理だったかも。
早速ありがとうございます。
Professional Edition だったのでこの機能は使えました。
ただ、VB6 のように、ブレークポイントを設置せずとも
ある変数の内容が直前の値から変化した瞬間に止めたい、
(というかその値になる箇所がどこなのかわからないので調べたい)
という使い方は出来ないような気がします。
ヘルプを見ても web を調べてもこういった方法は見つかりませんでした。
他にやり方あるでしょうか。
質問の回答じゃないけど、
>ある変数の内容が直前の値から変化した瞬間に止めたい、
>(というかその値になる箇所がどこなのかわからないので調べたい)
自分で作ったプログラムなら分かるし、他人が作ったプログラムなら
変数が左辺に来ている所だろうし、テキスト検索だけあれば困った
ことが無いかなぁ。。。
特攻隊長まるるうさん。
普通はそうですよね。
ただ、今回は変数に代入しているところを全てチェックしても
どこでセットされちゃってるのか分からない状況になってるので
ほとほと困ってる次第です。
6箇所ぐらいしか無いので見落としは無いんですが・・。
それから、複数のベンダーが同時開発するような巨大な
システムのソースを追いかける際には、こういった機能は
非常に便利です。
> ただ、今回は変数に代入しているところを全てチェックしても
> どこでセットされちゃってるのか分からない状況になってるので
VB.NET でそうなる場合は。。。どんな場合かなぁ?
ByRef で受け取った後、クラスの内部変数(名称違うもの)で変更してるとか?
参照型だと色々できそうかなぁ。。
何にせよもっと範囲を絞らないと見当もつかないので、
ウォッチ式に追加しておいて、何箇所かにブレークポイントを置いて、徐々に
その範囲を絞って、変更される近辺を重点的に調べてみるとか。
>6箇所ぐらいしか無いので見落としは無いんですが・・。
そのくらいなら最初から最後までステップ実行できそうな気も。。。
それでも分からないって話ですよね?
[呼び出し履歴]で何か引っ掛かるクラスが呼び出されていないでしょうかね。
外部DLL参照してて、実はデバッグの為の情報が無いとかじゃないのかなぁ。
[シンボルを使用したデバッグ]
http://msdn.microsoft.com/ja-jp/library/bb694540(VS.85).aspx
>それから、複数のベンダーが同時開発するような巨大な
>システムのソースを追いかける際には、こういった機能は
>非常に便利です。
ソースを追いかけるのは最後の手段であって、設計書で議論できない開発を
基準としない方が良いと思います。
コーディング規約は決まっていますか?
可読性を上げるような設計思想でプログラミング設計されていますか?
ちゃんと機能ごとに切り分けられていて、他に影響が及ばないように
設計されていれば、対象の範囲だけ見ればいいので、プロジェクトの
大きさは関係なくなると思いますが。
一時的に、その変数を Property に変更できるのであれば、
Set ブロックにて変更のタイミングを捉えられるかも。
> ByRef で受け取った後、クラスの内部変数(名称違うもの)で変更してるとか?
たとえば、
Sub Test(ByRef s As String)
s = "New Text"
End Sub
の場合、
Dim x As String = "old Value"
Test(TextBox1.Text)
Test(x)
としただけでも、TextBox1.Text や変数 x の内容は書き換わりますね。
お騒がせしております。
結論から言うと、いつのまにか現象が発生しなくなっていました。
開発サーバを再起動したようなので、それで直ったのかもしれません。
ちなみにステップ実行すると現象が再現しなかったのです。
イベント絡みの所でもなかったし・・。
もちろん ByRef も調べました。
> ちゃんと機能ごとに切り分けられていて、他に影響が及ばないように
> 設計されていれば、対象の範囲だけ見ればいいので、プロジェクトの
> 大きさは関係なくなると思いますが。
10年ぐらい前ですが、とある大手ベンダーのソースを買い取って
カスタマイズしていたもので、購入した時点ではっきりいって
ぐちゃぐちゃだったんです。仕様書も含めて。
当時、ソース購入にはかなり反対したんですけどね。
なので、
> ソースを追いかけるのは最後の手段
ということで「式の内容が変化したときに中断」の機能を
よく使っていたので VB2005 にもあるのかなと思った次第であります。
話が脱線してしまっていますが、
この機能が廃止されちゃったのかどうなのかが気がかりです。
もしかしてVB6の時に使ったことある人が少ない?
VB6の掲示板に質問したほうが良いですかね?
追伸
Access や Excel の VBA にもあった機能ですし、
「式の内容が変化したときに中断」でググると
それらの使い方を紹介したサイトも出てきますが、
VB.NET になってからどうなったのかが見つからないですね。
> この機能が廃止されちゃったのかどうなのかが気がかりです。
廃止というか、実装されていないというか。
欲しいという声はたびたび聞きますし、要望自体は挙がっているらしいのですが、
それでも未だに実装されていないのは、何か技術的な都合があるのかも。
# 要望の高かった Edit & Continue は 2005 で実装してもらえたのですけれどね。(32bit版だけですが…)
> 廃止というか、実装されていないというか。
やっぱり VB6 と .NET は別物なんですね。
エディット&コンティニューは 2005 から復活(?)したんですね。
以前の .NET では出来なかったのに最近出来るようになったので、
何か設定で出来る出来ないを選択するようになっているもんだと
思っていました。
いろいろとありがとうございました。
とりあえずクローズです。
> やっぱり VB6 と .NET は別物なんですね。
VB6 開発環境の場合、インタプリタで逐次処理できるのが大きいですね。
それゆえ VB6 では、コンパイルエラーを含むコードでさえも実行できる場合があります。
たとえば
Option Explicit
Private Sub Form_Load()
MsgBox "TEST"
End Sub
Private Sub Command1_Click()
Dim Dim Dim '明らかにエラー
End Sub
のコードを、[F5] で実行すれば、フォーム起動と共に "TEST" のメッセージボックスが
何の問題無く表示される事になります。(ただし、[Ctrl] + [F5] では実行不可)
しかもその後、ボタン(Command1)を押すとコンパイルエラーが通知されるものの、
それを Edit & Continue で修正して、処理を続行することさえできます。
ところが VB.NET の場合、EXE にコンパイルしてから実行される仕様のため、
現状、上記のような事はできません。
> エディット&コンティニューは 2005 から復活(?)したんですね。
結局、この機能を搭載するには、VSや言語側だけではなく、Framework 自体の修正も
必要になるということで、内部的な仕組みは .NET 1.1 に実装されてはいたらしいです。
ただ、Visual Studio.NET 2003 側の対応が間に合わないという事で、リリース時期としては
Visual Basic 7.1 への搭載ではなく、その次の 2005 (VB8) からになったそうです。
ちなみに Visual C# に関しては、2005(C#2.0) でも搭載されない予定だったのですが
2005 のベータ版をリリースした際にも、あまりにも要望が高かったので、急遽、
前倒しで搭載されることになったそうな。
http://www.users.gr.jp/blogs/daigoh/archive/2004/10.aspx
# というわけで、要望が高い機能については次期以降の製品開発時に
# 反映される可能性もあるので、下記から機能提案してみるのも良いかも。
# https://connect.microsoft.com/VisualStudioJapan/
なお 2010 のデバッグ機能はかなり強化されているそうなので(ステップ実行の逆再生など)
日本語版の正式リリースが待ち遠しいところです。
http://ascii.jp/elem/000/000/514/514393/
http://www.itmedia.co.jp/enterprise/articles/1004/14/news014.html
ツイート | ![]() |