Google Chromeでのデバッグ中にjavascript変数値を変更することは可能ですか?


81

私は(Chrome開発ツールを使用して)JavaScriptアプリをデバッグしていますが、コードをステップ実行しながらいくつかの変数値を変更したいと思います。

それは可能ですか?

私は次のようなものを試しました。

> modeline
1
> modeline=0
0             <<< seems to work but... 
> modeline
1             <<< ups!!

しかし、何ができるか、何ができないかを説明しているドキュメントを見つけることができません...


いくつかのコードを投稿してください。どこmodelineから来たの?
Emil Ivanov 2011年

4
@エミル:それは重要ですか?modelineはグローバル変数です。window.modelineを使用して変更しようとしましたが、同じ結果になりました。しかし、この質問は、関数内で宣言されたローカル変数にも関連しています
tato 2011年

4
この動作を確認できます。ChromeでJSオブジェクトのプロパティを変更しても、インタプリタでのオブジェクトの実際の値には影響がないようです。Firefoxでは、同じ変更を加えると、jsスクリプトの評価が予想どおりに異なります。Chrome perapsのある種のエクストラセキュリティ?Chromeでオフにできるかどうか誰かが知っているので、jsのデバッグに使用できますか?
Nikolaj Hansen

1
提出されたバグレポートをこのために。
GreenGiant 2012年

1
すでにV8で実装されています:Issue 2399今Chromiumの開発者ツールを更新する必要があります:Issue 124206
gabrielmaldi

回答:


39

なぜこの答えはまだ賛成を得ているのですか?

パーミカエル・メイヤーの答えは、これはもはや問題ではない、と私の答えは廃止されました(go()今で返し30コンソールでいじくる後)。上記のgabrielmaldiのコメントにリンクされているバグレポートによると、これは2013年7月に修正されました。それは私がまだ賛成票を獲得していることを私に警告します-賛成票が質問または私の答えのどちらも理解していないと私に思わせます。

私は歴史的な理由のためにここに私の元の答えを残して、しかしますupvote行くミカエルの答えを代わりに


秘訣は、ローカル変数を直接変更することはできませんが、オブジェクトのプロパティを変更することはできます。グローバル変数の値を変更することもできます。

var g_n = 0;
function go()
{
    var n = 0;
    var o = { n: 0 };
    return g_n + n + o.n;  // breakpoint here
}

コンソール:

> g_n = 10
  10
> g_n
  10
> n = 10
  10
> n
  0
> o.n = 10
  10
> o.n
  10

go()ブレークポイントを設定してコンソールでそれらの呼び出しを実行した後の結果を確認すると、結果は0ではなく20(ただし、残念ながら30ではない)であることがわかります。


2016年1月19日クロム最新の、些細なコード(VARのA = 1;デバッガ;にconsole.log();)バグが...まだ存在している
Offirmo

@ Offirmo-1ログに記録されます。バグは何ですか?何が記録されると思いましたか?
gilly3 2016年

デバッガーを開いた状態aで、「スコープ」パネルでの値を
任意

@ Offirmo-私には向いていません: スクリーンショット。しかし、それを関数でラップすると、あなたが説明していることがわかります。面白い。ただし、コンソールに直接入力することで値を変更できます(個人的にはスコープパネルを使用するよりも簡単です)。 スクリーンショット スコープパネルで値を変更しようとしたことは一度もないと思います。私はいつもコンソールで値を変更する式を実行するだけで、それは何があっても機能するようです。
gilly3 2016

4
あなたの答えは、すべての基準を満たしているので、私はupvoted 「良い答えを」 受け入れ答えから来る- -それはインスタントの信頼性を与えるあなたは、より新しい、より良い情報を提供し、別の答えに言及します。ほんとありがと。そして、賛成票をお楽しみください!
gfullam 2016

67

これは現在、chrome 35で可能です(現在、2014年7月11日現在)。ただし、どのバージョンで最初に許可されたかはわかりません。

私のマシンで@ gilly3の例をテストしたところ、動作しました。

  • コンソールを開き、SourcesタブSnippetsで新しいスニペットを追加し、次のコードを貼り付けます。

    var g_n = 0; function go() { var n = 0; var o = { n: 0 }; return g_n + n + o.n; // breakpoint here }

  • スニペット名を右クリックし、[実行]をクリックします(ただし、これは関数を起動しません)

  • returnステートメントにブレークポイントを追加します。
  • 以下のコンソールで、次のように入力します go()
  • 以下に示すように変数値を変更します

ローカル変更が許可された関数。

返される結果g_n + n + o.nは30です。


1
このバグのリグレッションは、ブライアンの回答で提供されているリンクで追跡されます
マイク

7

これは、Chrome開発ツールで認識されているバグです。

http://code.google.com/p/chromium/issues/detail?id=124206


それは3月21日、2013年に固定されたように見える私はクロームのバージョン、それはになりますを伝えるためにかどうかはわかりません。
デビッド・

@David彼らはBlinkでそれを修正しました、Blinkを使用するChromeビルドを取得するのにしばらく待たなければならないかもしれません
Anshul 2013年

3
Chromeバージョン49.0.2623.87では(再び)壊れています。重要性を高めたい場合は、上記のリンクにサインインして問題にスターを付けてください。
マイク

6

はい!最終的に!MacのChromeバージョン66.0.3359.170(公式ビルド)(64ビット)で試してみました。

最初の図のようにスコープ内の値を変更することも、2番目の図のようにコンソールを使用して値を変更することもできます。

Chromeデバッガーの値の変更

ここに画像の説明を入力してください


これは、複雑な状況(間隔やトリガーなど)でも機能するようです。
Gerfried 2010年

4

そうではないようです。

ブレークポイントを設定し、コンソールへの切り替えが停止したら、変数を設定してみてください。別の値を割り当ててもエラーは発生しませんが、割り当て後に読み取った場合は変更されません。:-/


わかりました...少なくとも、私が見ているのと同じ動作が見られます。しかし...それは可能ですか?
tato 2011年


2

実際には回避策があります。メソッド全体をコピーし、その名前を変更します。たとえば、originalName()をoriginalName2()に変更しますが、内部の変数を変更して、必要な値を取得するか、パラメーターとして渡します。

次に、このメソッドをコンソールから直接呼び出すと、同じ機能がありますが、変数値を変更できます。

メソッドが自動的に呼び出される場合は、代わりにコンソールに入力します

originalName = null;
function originalName(original params..)
{
    alert("modified internals");
    add whatever original code you want
}

2

コンソールで割り当てることにより、スクリプト変数の値を変更できます。最も単純なようです。


1

Chromeチームがこのばかげた機能を許可しない理由はわかりません...しかし、変数値を正常に変更できる唯一の方法は、Chromeエディターの[ソース]タブでスクリプトを直接変更することです(これにより、ページを更新するまでスクリプト)を更新しますが、更新するとその変更は失われるため、注意してください。


0

同じ問題が発生し、[GoogleChromeについて]-> [ヘルプ]に移動すると、最新のアップデートを取得するにはブラウザを再起動する必要があると表示されました。

これを行ったところ、突然、ローカル変数を変更できるようになりました。[スコープ変数]ウィンドウで編集する変数をクリックし、新しい値を入力するだけです。

ただし、右側のウィンドウ(スコープ変数)のテキストを変更する前に、無関係な変数の割り当てをステップオーバーする必要があるという奇妙なことに気づきました。


ローカルストレージを使用してプロパティを保存したことがある場合は、[リソース]-> [LocalStorage]に移動して、そこに直接保存したプロパティを編集することもできます。
GilesDMiddleton 2013年

0

実行フローを中断することなく、コードのブロックが実行されるたびに値を変更するには

デバッガーの「ログポイント」機能は、中断することなく任意の値をコンソールに記録できるように設計されています。実行フロー内のコードを評価します。つまり、実際に使用して、停止することなくその場で値を変更できます。

行番号を右クリックして「ログポイント」を選択し、代入式を入力します。これは次のようになります。

ここに画像の説明を入力してください

デバッグ行を使用してプロジェクトを再構築しなくても、他の方法では再現しにくい状態に値を設定するのに非常に便利です。完了したら、ブレークポイントを削除することを忘れないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.