87 votes

Est-il possible de modifier les valeurs des variables javascript pendant le débogage dans Google Chrome ?

Je suis en train de déboguer une application javascript (en utilisant les outils de développement de Chrome), et je voudrais modifier certaines valeurs de variables tout en parcourant le code.

Est-ce possible ?

J'ai essayé et j'ai obtenu quelque chose comme :

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

Mais je n'arrive pas à trouver de documentation qui indique ce qui peut ou ne peut pas être fait...

0 votes

Affichez un code. Où se trouve modeline vient ?

4 votes

@Emil : Est-ce important ? modeline est une variable globale, j'ai aussi essayé de la modifier en utilisant window.modeline avec les mêmes résultats. Mais cette question est également pertinente pour les variables locales déclarées à l'intérieur d'une fonction.

0 votes

Je le fais fréquemment sans problème. Une fonction extérieure pourrait-elle modifier votre variable ? Essayez de placer un point d'arrêt partout dans le code où elle est modifiée.

71voto

Mikaël Mayer Points 2408

Pourquoi cette réponse obtient-elle encore des votes positifs ?

Il y a une meilleure réponse que celle-ci après toutes ces années, et je l'approuve puisque je l'utilise en permanence. Aller upvote Tyler Collier à la place. Ils expliquent que vous pouvez soit modifier les valeurs dans la console, soit dans la trace de la pile. Pas besoin d'astuce.


Réponse obsolète

C'est désormais possible dans chrome 35 (aujourd'hui à partir du 11 juillet 2014). Je ne sais pas quelle version l'a autorisé en premier cependant.

Je viens de tester l'exemple de @gilly3 sur ma machine et cela fonctionne.

  • Ouvrez la console, dans Sources et l'onglet Snippets ajoutez un nouveau snippet et collez-y le code suivant :

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

  • Cliquez avec le bouton droit de la souris sur le nom du snippet, puis cliquez sur "Exécuter" (cela ne déclenche pas la fonction).

  • Ajoutez le point d'arrêt à l'instruction de retour.

  • Dans la console ci-dessous, tapez go()

  • et modifiez les valeurs des variables comme indiqué ci-dessous

function with local modification allowed.

et le résultat retourné g_n + n + o.n est de 30 ans.

1 votes

La régression de ce bogue est suivie dans le lien prévu dans Réponse de Brian .

0 votes

Chrome ne me laisse pas mettre un point d'arrêt dans le snippet.

40voto

gilly3 Points 33285

Pourquoi cette réponse obtient-elle encore des votes positifs ?

Par La réponse de Mikaël Mayer ce n'est plus un problème, et ma réponse est obsolète ( go() retourne maintenant 30 après s'être amusé avec la console). Ce problème a été corrigé en juillet 2013, selon la rapport de bogue lié ci-dessus dans Commentaire de gabrielmaldi . Cela m'inquiète que je reçoive encore des votes positifs, ce qui me fait penser que le votant ne comprend ni la question ni ma réponse.

Je vais laisser ma réponse originale ici pour des raisons historiques, mais votez en hausse La réponse de Mikaël au lieu de .


L'astuce est que vous ne pouvez pas modifier directement une variable locale, mais vous pouvez modifier les propriétés d'un objet. Vous pouvez également modifier la valeur d'une variable globale :

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

console :

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

Vérifiez le résultat de go() après avoir défini le point d'arrêt et lancé ces appels dans la console, et vous constaterez que le résultat est 20, plutôt que 0 (mais malheureusement, pas 30).

0 votes

2016/01/19 Chrome latest, code trivial (var a = 1 ; debugger ; console.log(a) ;) le bug est toujours présent...

0 votes

@Offirmo - 1 est enregistré. Quel est le bug ? Qu'attendiez-vous d'être enregistré ?

0 votes

Avec le débogueur ouvert, changez la valeur de a à n'importe quoi (ex. 42) dans le panneau "scope" alors resume : 1 est enregistré

8voto

brianpeiris Points 7693

Il s'agit d'un bogue reconnu dans les outils de développement de Chrome :

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

0 votes

Il semble qu'il ait été corrigé le 21 mars 2013. Je ne suis pas sûr de savoir comment dire dans quelle version de chrome il sera.

0 votes

David Ils l'ont corrigé dans Blink, mais nous devrons peut-être attendre un certain temps pour obtenir une version de Chrome qui utilise Blink.

3 votes

Il est cassé (encore) dans la version 49.0.2623.87 de Chrome. Connectez-vous au lien ci-dessus et commencez le problème si vous voulez en augmenter l'importance.

5voto

Bobo Points 1303

Firebug semble vous permettre de le faire.

3 votes

Il en va de même pour IE et Opera Dragonfly.

5 votes

L'Opéra Dragonfly me manque vraiment -____-

2voto

mdubez Points 232

En fait, il existe une solution de rechange. Copiez la méthode entière, modifiez son nom, par exemple OriginalName() en OriginalName2() mais modifiez la variable à l'intérieur pour qu'elle prenne la valeur que vous voulez, ou passez-la en tant que paramètre.

Ensuite, si vous appelez cette méthode directement depuis la console, elle aura la même fonctionnalité mais vous pourrez modifier les valeurs des variables.

Si la méthode est appelée automatiquement, tapez plutôt dans la console

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X