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».
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'
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
.
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 ...
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.
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 ...
Recommended Posts