[PYTHON] Désactivez les options d'optimisation dans l'environnement de développement Google App Engine Go dev_appserver.py

introduction

Dans Google App Engine, l'environnement de développement est démarré en exécutant le script appelé dev_appserver.py.

Je veux utiliser le débogueur dans l'environnement GAE / Go, mais dans dev_appserver.py, je ne peux pas passer l'option pour go build, et il compile toujours dans l'état optimisé. Lors du débogage, je souhaite déboguer tout en faisant correspondre correctement le code source sans l'optimiser. (Il est difficile de déboguer si l'ordre des instructions est modifié par optimisation)

Cet article décrit comment créer avec les options d'optimisation désactivées et comment le débogueur le prend en charge.

Si vous voulez juste voir la conclusion, consultez «Désactiver les options d'optimisation».

Options d'optimisation

Si vous vérifiez l'aide de go build, vous verrez qu'il existe une option appelée --gcflags.

$ go build --help
Abréviation
-gcflags 'arg list'
        arguments to pass on each go tool compile invocation.

Je ne connais pas les détails avec cela seul, mais comme go build exécute la commande go tool compile lors de la compilation, ceci [compile - The Go Programming Language](https: // golang) Vérifiez .org / cmd / compile /).

Ensuite, vous pouvez voir que les deux suivants seront probablement nécessaires lors du débogage. En arrêtant l'optimisation et l'expansion en ligne, le code source et le binaire exécutable peuvent être correctement mis en correspondance.

-N
	Disable optimizations.
-l
	Disable inlining.

En d'autres termes, lors de la construction avec dev_appserver.py, ce serait bien si vous pouviez faire ce qui suit.

$ go build -gcflags '-N -l'

Comment construire avec dev_appserver.py

Ensuite, j'aimerais voir comment dev_appserver.py se construit.

Le démarrage de dev_appserver.py lance un thread pour le serveur API, chaque module créé par le développeur et la console d'administration.

C'est le thread du module qui construit le code source. Il surveille également les mises à jour des fichiers et se construit automatiquement en cas de modifications.

La construction est réalisée à l'aide de l'outil $ (SDK_PATH) / goroot / bin / go-app-builder dans le SDK. C'est fondamentalement comme «go build», mais il est personnalisé spécifiquement pour GAE / Go.

L'implémentation interne de go-app-builder est le code source de go qui réside dans $ (SDK_PATH) / goroot / src / cmd / go-app-builder.

Lisons l'aide de go-app-builder.

$ (SDK_PATH)/goroot/src/cmd/go-app-builder --help
Abréviation
-gcflags 'arg list'
        arguments to pass on each go tool compile invocation.

Il semble que vous puissiez passer -gcflags ainsi que go build. En d'autres termes, il s'avère qu'il n'est pas nécessaire de modifier le code source de go-app-builder. Il semble donc que nous puissions le gérer tant que nous savons comment dev_appserver.py exécute go-app-builder.

Si vous grep avec go-app-builder, vous pouvez voir que go-app-builder est en cours d'exécution à $ (SDK_PATH) / google / appengine / tools / devappserver2 / go_application.py.

Désactiver les options d'optimisation

Il existe une option go-app-builder autour de la ligne 86 de $ (SDK_PATH) /google/appengine/tools/devappserver2/go_application.py, alors ajoutez -gcflags.

  gab_args = [
      _GAB_PATH,
      '-app_base', application_root,
      '-arch', arch,
      '-dynamic',
      '-goroot', GOROOT,
      '-gopath', os.environ.get('GOPATH', GOPATH),
      '-nobuild_files', '^' + str(nobuild_files),
      '-incremental_rebuild',
      '-unsafe',
+     '-gcflags', '-N -l',
  ]

Si vous le déplacez réellement avec cela, vous pouvez confirmer qu'il a été construit sans problème. De plus, lorsque j'ai sorti le journal au moment de la construction, j'ai pu confirmer que l'option avait été passée au moment de la compilation.

Mais je ne savais pas comment vérifier si je pouvais le construire sans vraiment l'optimiser. Si le binaire est généré, je peux vérifier s'il est optimisé à partir du binaire ...

Activez et désactivez l'optimisation avec les options de ligne de commande dans dev_appserver.py

J'ai modifié de force le code source plus tôt, mais idéalement, je voudrais passer une option à dev_appserver.py pour activer et désactiver l'optimisation. GAE / PHP fournit une telle option.

$ dev_appserver.py --help
  --php_remote_debugging [PHP_REMOTE_DEBUGGING]
                        enable XDebug remote debugging (default: False)

J'ai lu le code source en pensant que si je fais les mêmes changements que PHP, je pourrais aller avec Go, mais les tampons de protocole sont utilisés en interne, et il y a du code généré automatiquement, mais l'important Je suis bloqué car le fichier .proto n'est pas dans le SDK.

en conclusion

Les développeurs de Gogland les ont suggérés à Google, mais ils n'ont pas fonctionné depuis longtemps. Peut-être que Google a son propre environnement de développement et n'attache pas beaucoup d'importance à dev_appserver.py ...

référence

Recommended Posts

Désactivez les options d'optimisation dans l'environnement de développement Google App Engine Go dev_appserver.py
Procédure de construction de l'environnement de développement Google App Engine / Python (fin 2014)
Développement Google AppEngine avec Docker
Création d'un environnement de développement avec Maven sur Google App Engine [Java]
[Google App Engine] Flux de la construction de l'environnement de développement à la création de l'application
Version d'exécution de l'environnement standard Google App Engine / Python
Environnement de développement en Python
Maintenance de l'environnement de développement Django + MongoDB (en cours d'écriture)
Déployer des applications Go sur Google App Engine avec des actions GitHub