Delphi: Der Aufruf einer C dll-Funktion mit dem Debugger dauert 15 s ohne Debugger 0,16 s. Warum?

8

Ich habe folgendes Setup:

  1. Eine Delphi-Befehlszeilenanwendung, die in Delphi XE5 geschrieben ist und in 64-Bit-Debugging erstellt wurde.
  2. Eine C-DLL, die in Microsoft Visual Studio 2013 geschrieben wurde und in Release 64-Bit erstellt wurde.
  3. Die Delphi-Befehlszeilenanwendung ruft eine Funktion in der C-DLL auf.

Was ist unerwartet:

  1. Beim Debuggen der Delphi-Befehlszeilenanwendung in der Delphi XE5-IDE dauert der Aufruf der C-DLL-Funktion 15 Sekunden.
  2. Wenn Sie dieselbe Delphi-Befehlszeilenanwendung direkt (ohne IDE, ohne Debugger) starten, dauert der Aufruf der C-DLL-Funktion 0,16 s.

Quellcode der Delphi-Befehlszeilenanwendung:

%Vor%

C dll Quellcode:

%Vor%

Delphi + C dll Quellcode: DelphiCpplibraryCall.zip

Laufzeitvergleich:

  • Erste Konsole: Beim Debuggen in IDE
  • Zweite Konsole: Beim Start ohne IDE

Aus irgendeinem Grund scheint der Delphi-Debugger den Aufruf der C-DLL-Funktion zu verlangsamen, was das Debugging nahezu unmöglich macht.

Hat jemand eine Ahnung, was könnte dieses Problem oder wie man es vermeiden? Vielen Dank.

Bearbeiten: Ich kann jetzt bestätigen, dass das beschriebene Verhalten nicht auf die Delphi IDE und den Debugger beschränkt ist. Dieses Problem tritt auch auf, wenn ich:

  1. Ich erstelle die C-DLL in Microsoft Visual Studio 2013 in Release.
  2. Erstellen und debuggen Sie die ausführbare Befehlszeile, die die C-DLL in Visual Studio 2013 aufruft.

Dies bedeutet, dass sich die Ausführungszeit für die Build-Funktion der C dll-Version ändert, je nachdem, ob ein Debugger angeschlossen ist oder nicht.

Ich kann auch bestätigen, dass das Löschen der unordered_map ( delete values; ) so lange dauert, bis ein Debugger vorhanden ist.

    
denim 27.08.2015, 13:23
quelle

2 Antworten

5

Wenn die Verzögerung vom Aufruf delete stammt, kann der Speichermanager (malloc) den Windows-Heap-Speichermanager verwenden. Der Heapspeicher-Manager führt zusätzliche umfangreiche Prüfungen durch, wenn Speicher freigegeben wird und ein Debugger angeschlossen ist.

Diese zusätzlichen Prüfungen können deaktiviert werden, indem die Umgebungsvariable _NO_DEBUG_HEAP auf 1 gesetzt wird (beginnt mit einem Unterstrich).

Sie können dies in Delphi für ein bestimmtes Projekt unter Project/Options.../Debugger/Environment Block tun oder Sie können _NO_DEBUG_HEAP zum Umgebungsblock des Benutzers unter Control Panel/System Properties/Advanced System Settings/Environment Variables/System Variables hinzufügen, damit es für alle Projekte und alle Anwendungen funktioniert. Aber dann müssen Sie möglicherweise abmelden, um die Änderungen zu übernehmen oder zumindest die IDE neu zu starten.

    
Andreas Hausladen 27.08.2015, 22:00
quelle
3

Dies scheint ein Problem mit der MSVC-Implementierung dieses STL-Containers zu sein. Wenn Sie den Visual Studio-Debugger verwenden, kann genau dasselbe Verhalten angezeigt werden. Die MSVC-Laufzeit wechselt das Verhalten, wenn sie einen Debugger erkennt.

Ich habe die folgenden Links gefunden, die sich auf dieses Problem beziehen:

Ein großer Teil des Problems scheint die Leistung beim Löschen der Karte zu sein. Entfernen Sie einfach die Zeile delete aus Ihrem C ++ - Code, um die Leistung erheblich zu verbessern.

Ich kann keine brauchbare Lösung für dieses Problem finden.

    
David Heffernan 27.08.2015 14:17
quelle

Tags und Links