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