[PYTHON] Deaktivieren Sie die Optimierungsoptionen in der Google App Engine Go-Entwicklungsumgebung dev_appserver.py

Einführung

In Google App Engine wird die Entwicklungsumgebung durch Ausführen des Skripts dev_appserver.py gestartet.

Ich möchte den Debugger in der GAE / Go-Umgebung verwenden, aber in dev_appserver.py kann ich die Option für "go build" nicht übergeben und sie wird immer im optimierten Zustand kompiliert. Beim Debuggen möchte ich debuggen, während der Quellcode richtig übereinstimmt, ohne ihn zu optimieren. (Es ist schwierig zu debuggen, wenn die Befehlsreihenfolge durch Optimierung geändert wird.)

In diesem Artikel wird beschrieben, wie Sie mit deaktivierten Optimierungsoptionen erstellen und wie der Debugger dies unterstützt.

Wenn Sie nur die Schlussfolgerung sehen möchten, lesen Sie "Optimierungsoptionen deaktivieren".

Optimierungsoptionen

Wenn Sie die Hilfe für "go build" überprüfen, werden Sie feststellen, dass es eine Option namens "--gcflags" gibt.

$ go build --help
Abkürzung
-gcflags 'arg list'
        arguments to pass on each go tool compile invocation.

Ich kenne die Details allein nicht, aber da go build beim eigentlichen Kompilieren den Befehl go tool compile ausführt, ist diese [compile - The Go Programming Language](https: // golang) Überprüfen Sie .org / cmd / compile /).

Dann können Sie sehen, dass die folgenden beiden beim Debuggen wahrscheinlich benötigt werden. Durch Stoppen der Optimierung und Inline-Erweiterung können der Quellcode und die ausführbare Binärdatei ordnungsgemäß abgeglichen werden.

-N
	Disable optimizations.
-l
	Disable inlining.

Mit anderen Worten, wenn Sie mit dev_appserver.py erstellen, wäre es schön, wenn Sie Folgendes tun könnten.

$ go build -gcflags '-N -l'

So erstellen Sie mit dev_appserver.py

Als nächstes möchte ich sehen, wie dev_appserver.py erstellt wird.

$ (SDK_PATH)/goroot/src/cmd/go-app-builder --help

-gcflags 'arg list'
        arguments to pass on each go tool compile invocation.

Es ist der Modulthread, der den Quellcode erstellt. Außerdem werden Dateiaktualisierungen überwacht und bei Änderungen automatisch erstellt. Der Build wird mit dem Tool $ (SDK_PATH) / goroot / bin / go-app-builder im SDK realisiert. Es ist im Grunde wie "go build", aber es ist speziell für GAE / Go angepasst. Die interne Implementierung von "go-app-builder" ist der Quellcode für "go", der sich in "$ (SDK_PATH) / goroot / src / cmd / go-app-builder" befindet. Lesen wir die Hilfe von go-app-builder. Es scheint, dass Sie sowohl "-gcflags" als auch "go build" abkürzen können. Mit anderen Worten, es stellt sich heraus, dass der Quellcode von "go-app-builder" nicht geändert werden muss. Es scheint also, dass wir damit umgehen können, solange wir wissen, wie dev_appserver.py go-app-builder ausführt.

Wenn Sie mit "go-app-builder" arbeiten, können Sie sehen, dass "go-app-builder" unter "$ (SDK_PATH) / google / appengine / tools / devappserver2 / go_application.py" ausgeführt wird.

Deaktivieren Sie die Optimierungsoptionen

Fügen Sie -gcflags hinzu, da es in Zeile 86 von $ (SDK_PATH) /google/appengine/tools/devappserver2/go_application.py eine Go-App-Builder-Option gibt.

  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',
  ]

Wenn Sie es tatsächlich damit verschieben, können Sie bestätigen, dass es ohne Probleme erstellt wurde. Als ich das Protokoll zur Erstellungszeit ausgab, konnte ich außerdem bestätigen, dass die Option zur Kompilierungszeit übergeben wurde.

Aber ich wusste nicht, wie ich überprüfen sollte, ob der Build wirklich nicht optimiert war. Wenn die Binärdatei generiert wird, kann ich überprüfen, ob sie aus der Binärdatei optimiert ist ...

Aktivieren und deaktivieren Sie die Optimierung mit den Befehlszeilenoptionen in dev_appserver.py

Ich habe den Quellcode früher zwangsweise geändert, aber im Idealfall möchte ich eine Option an dev_appserver.py übergeben, um die Optimierung ein- und auszuschalten. GAE / PHP bietet eine solche Option.

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

Ich habe den Quellcode gelesen und dachte, wenn ich die gleichen Änderungen wie PHP vornehme, könnte ich mit Go gehen, aber Protokollpuffer werden intern verwendet, und es wird automatisch Code generiert, aber der wichtige Ich stecke fest, weil die .proto-Datei nicht im SDK enthalten ist.

abschließend

Gogland-Entwickler haben diese Google vorgeschlagen, aber sie haben lange nicht mehr funktioniert. Vielleicht hat Google eine eigene Entwicklungsumgebung und misst dev_appserver.py nicht viel Bedeutung bei ...

Referenz

Recommended Posts

Deaktivieren Sie die Optimierungsoptionen in der Google App Engine Go-Entwicklungsumgebung dev_appserver.py
Konstruktionsverfahren für die Google App Engine / Python-Entwicklungsumgebung (Ende 2014)
Google AppEngine-Entwicklung mit Docker
Erstellen einer Entwicklungsumgebung mit Maven in Google App Engine [Java]
[Google App Engine] Ablauf von der Erstellung der Entwicklungsumgebung bis zur Erstellung der Anwendung
Laufzeitversion der Google App Engine / Python-Standardumgebung
Entwicklungsumgebung in Python
Wartung der Django + MongoDB-Entwicklungsumgebung (mitten im Schreiben)
Stellen Sie Go-Apps mit GitHub-Aktionen für Google App Engine bereit