From ff365dcd948cf5640cb82aece2f7577bd6b5c683 Mon Sep 17 00:00:00 2001 From: arakov Date: Sun, 4 Aug 2024 21:33:42 +0200 Subject: [PATCH] #658 : creating dpa --- .github/workflows/msbuild.yml | 2 +- VERSION | 2 +- build/aarch64/build_package_arm64.script | 2 +- build/aarch64/control | 2 +- build/amd64/build_package_amd64.script | 2 +- build/amd64/control | 2 +- build/elena_inno.iss | 2 +- build/i386/build_package_i386.script | 2 +- build/i386/control | 2 +- build/ppc64le/build_package_ppc64le.script | 2 +- build/ppc64le/control | 2 +- doc/features | 28 +++++++++ doc/todo.txt | 44 ++++++++++++- elenasrc3/dpa/dpa_queue.h | 67 ++++++++++++++++++++ elenasrc3/dpa/dpa_session.cpp | 38 ++++++++++++ elenasrc3/dpa/dpa_session.h | 28 +++++++++ elenasrc3/dpa/dpa_stream.cpp | 26 ++++++++ elenasrc3/dpa/dpa_stream.h | 31 +++++++++ elenasrc3/engine/windows/winevents.h | 69 +++++++++++++++++++++ elenasrc3/ide/ideversion.h | 2 +- elenasrc3/ide/vs/elide.vcxproj | 1 + elenasrc3/ide/windows/win32debugprocess.cpp | 44 +------------ elenasrc3/ide/windows/win32debugprocess.h | 29 ++------- elenasrc3/ldbg/ldbg_common.h | 28 +++++++++ elenasrc3/ldbg/ldbg_const.h | 2 +- elenasrc3/ldbg/ldbg_session.cpp | 20 +++++- elenasrc3/ldbg/ldbg_session.h | 4 ++ elenasrc3/ldbg/vs/ldbg.vcxproj | 7 ++- elenasrc3/ldbg/windows/ldbg.cpp | 1 + 29 files changed, 407 insertions(+), 84 deletions(-) create mode 100644 elenasrc3/dpa/dpa_queue.h create mode 100644 elenasrc3/dpa/dpa_stream.cpp create mode 100644 elenasrc3/dpa/dpa_stream.h create mode 100644 elenasrc3/engine/windows/winevents.h create mode 100644 elenasrc3/ldbg/ldbg_common.h diff --git a/.github/workflows/msbuild.yml b/.github/workflows/msbuild.yml index 1b16320f1..12af778f3 100644 --- a/.github/workflows/msbuild.yml +++ b/.github/workflows/msbuild.yml @@ -20,7 +20,7 @@ env: # https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix BUILD_CONFIGURATION: Release - BUILD_TAG: 6.2.3 + BUILD_TAG: 6.2.4 permissions: contents: read diff --git a/VERSION b/VERSION index 30bc70ba1..31b44b032 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.2.2 \ No newline at end of file +6.2.4 \ No newline at end of file diff --git a/build/aarch64/build_package_arm64.script b/build/aarch64/build_package_arm64.script index 22e50bb81..96c250922 100755 --- a/build/aarch64/build_package_arm64.script +++ b/build/aarch64/build_package_arm64.script @@ -1,5 +1,5 @@ #!/bin/bash -RELEASE=elena-6.2.3.aarch64-linux +RELEASE=elena-6.2.4.aarch64-linux mkdir -p /usr/share/elena mkdir -p /etc/elena/ diff --git a/build/aarch64/control b/build/aarch64/control index 4724d00d5..56a4f0f5c 100644 --- a/build/aarch64/control +++ b/build/aarch64/control @@ -1,5 +1,5 @@ Package: elena-lang -Version: 6.2.3 +Version: 6.2.4 Architecture: aarch64 Maintainer: Alex Rakov Depends: libc6 (>= 2.1) diff --git a/build/amd64/build_package_amd64.script b/build/amd64/build_package_amd64.script index eb0387e0d..e144bd227 100755 --- a/build/amd64/build_package_amd64.script +++ b/build/amd64/build_package_amd64.script @@ -1,5 +1,5 @@ #!/bin/bash -RELEASE=elena-6.2.3.amd64-linux +RELEASE=elena-6.2.4.amd64-linux mkdir -p /usr/share/elena mkdir -p /etc/elena/ diff --git a/build/amd64/control b/build/amd64/control index a8c6cdb32..2f7c30f55 100644 --- a/build/amd64/control +++ b/build/amd64/control @@ -1,5 +1,5 @@ Package: elena-lang -Version: 6.2.3 +Version: 6.2.4 Architecture: amd64 Maintainer: Alex Rakov Depends: libc6 (>= 2.1) diff --git a/build/elena_inno.iss b/build/elena_inno.iss index 42afc8118..f1224fbc2 100644 --- a/build/elena_inno.iss +++ b/build/elena_inno.iss @@ -7,7 +7,7 @@ ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{3CAA69D3-0F98-44B1-A73E-E864BA51D5BD} AppName=ELENA Programming Language -AppVersion=6.2.3 +AppVersion=6.2.4 ;AppVerName=ELENA Programming Language 6.2.0 AppPublisher=Alexey Rakov AppPublisherURL=http://github.com/ELENA-LANG/elena-lang diff --git a/build/i386/build_package_i386.script b/build/i386/build_package_i386.script index 74e0924cd..bffdcc5a1 100755 --- a/build/i386/build_package_i386.script +++ b/build/i386/build_package_i386.script @@ -1,5 +1,5 @@ #!/bin/bash -RELEASE=elena-6.2.3.i386-linux +RELEASE=elena-6.2.4.i386-linux mkdir -p /usr/share/elena mkdir -p /etc/elena/ diff --git a/build/i386/control b/build/i386/control index bbb12a2ec..87ccf9116 100644 --- a/build/i386/control +++ b/build/i386/control @@ -1,5 +1,5 @@ Package: elena-lang -Version: 6.2.3 +Version: 6.2.4 Architecture: i386 Maintainer: Alex Rakov Depends: libc6 (>= 2.1) diff --git a/build/ppc64le/build_package_ppc64le.script b/build/ppc64le/build_package_ppc64le.script index 10c8c0a2b..9539ccb13 100755 --- a/build/ppc64le/build_package_ppc64le.script +++ b/build/ppc64le/build_package_ppc64le.script @@ -1,5 +1,5 @@ #!/bin/bash -RELEASE=elena-6.2.3.ppc64le-linux +RELEASE=elena-6.2.4.ppc64le-linux mkdir -p /usr/share/elena mkdir -p /etc/elena/ diff --git a/build/ppc64le/control b/build/ppc64le/control index 0e0690ba1..f6631d0f0 100644 --- a/build/ppc64le/control +++ b/build/ppc64le/control @@ -1,5 +1,5 @@ Package: elena-lang -Version: 6.2.3 +Version: 6.2.4 Architecture: ppc64le Maintainer: Alex Rakov Depends: libc6 (>= 2.1) diff --git a/doc/features b/doc/features index c13bd0250..a41d3b01c 100644 --- a/doc/features +++ b/doc/features @@ -90,3 +90,31 @@ public program() ---------------------------------------------------------------------------- var s := var s := $"a_{ 1 }_b_{ 2 }_c"; + +---------------------------------------------------------------------------- + user-defined literals +---------------------------------------------------------------------------- + + import extensions; + + sealed struct OctalNumber + { + int value; + + int cast() = value; + + constructor(int n) + { + value := n; + } + + cast o(string s) + { + value := s.toInt(8); + } + } + + public program() + { + var n := 12o; + } diff --git a/doc/todo.txt b/doc/todo.txt index b004f9a17..2685a9793 100644 --- a/doc/todo.txt +++ b/doc/todo.txt @@ -10,6 +10,7 @@ In development: dev: - upndown (connector) - async programming + - chat: add mutex (see dpa_queue) gen: - lpad maint: @@ -21,7 +22,6 @@ In development: - User-defined string literals -------------------------------------- - #658 : connect with ldbg from VSCode - -------------------------------------- ### EPIC: elena 6.4 ### @@ -34,3 +34,45 @@ In development: prom: -------------------------------------- -------------------------------------- + + === Iteration 32 === + -------------------------------------- + dev: + gen: + maint: + port: + prom: + -------------------------------------- + -------------------------------------- + + === Iteration 33 === + -------------------------------------- + dev: + gen: + maint: + port: + prom: + -------------------------------------- + -------------------------------------- + + === Iteration 34 === + -------------------------------------- + dev: + gen: + maint: + port: + prom: + -------------------------------------- + -------------------------------------- + + ### EPIC: elena 6.5 ### + + === Iteration 35 === + -------------------------------------- + dev: + gen: + maint: + port: + prom: + -------------------------------------- + -------------------------------------- diff --git a/elenasrc3/dpa/dpa_queue.h b/elenasrc3/dpa/dpa_queue.h new file mode 100644 index 000000000..b0c655eda --- /dev/null +++ b/elenasrc3/dpa/dpa_queue.h @@ -0,0 +1,67 @@ +//--------------------------------------------------------------------------- +// E L E N A P r o j e c t: ELENA Debugger Adapater +// +// This file contains the DPA queue declarations +// +// (C)2024, by Aleksey Rakov +//--------------------------------------------------------------------------- + +#ifndef DPA_QUEUE_H +#define DPA_QUEUE_H + +#include +#include +#include +#include + +namespace dpa +{ + // --- ContentReader --- + template + class ThreadQueue + { + bool _closed = false; + std::queue _queue; + std::condition_variable _cv; + std::mutex _mutex; + + public: + void close(); + + void put(const T& in); + std::optional take(); + }; + + template + void ThreadQueue :: close() + { + std::unique_lock lock(_mutex); + _closed = true; + _cv.notify_all(); + } + + template + void ThreadQueue :: put(const T& in) + { + std::unique_lock lock(_mutex); + auto notify = _queue.size() == 0 && !_closed; + _queue.push(in); + if (notify) + _cv.notify_all(); + } + + template + std::optional ThreadQueue :: take() + { + std::unique_lock lock(_mutex); + _cv.wait(lock, [&] { return _queue.size() > 0 || _closed; }); + if (_queue.size() == 0) { + return std::optional(); + } + auto out = std::move(_queue.front()); + _queue.pop(); + return std::optional(std::move(out)); + } +} + +#endif \ No newline at end of file diff --git a/elenasrc3/dpa/dpa_session.cpp b/elenasrc3/dpa/dpa_session.cpp index fbab19d18..1acfdf213 100644 --- a/elenasrc3/dpa/dpa_session.cpp +++ b/elenasrc3/dpa/dpa_session.cpp @@ -17,5 +17,43 @@ Session :: Session() Session :: ~Session() { + _inbox.close(); + if (_recvThread.joinable()) { + _recvThread.join(); + } + if (_dispatchThread.joinable()) { + _dispatchThread.join(); + } + _reader.close(); +} + +void Session :: connect() +{ + _reader = ContentReader(); +} + +Payload Session :: getPayload() +{ + return {}; +} + +void Session :: start(const ClosedHandler& onClose) +{ + _recvThread = std::thread([this/*, onClose*/] { + while (_reader.isOpen()) { + if (auto payload = getPayload()) { + _inbox.put(std::move(payload)); + } + } + //if (onClose) { + // onClose(); + //} + }); + + _dispatchThread = std::thread([this] { + while (auto payload = _inbox.take()) { + payload.value()(); + } + }); } \ No newline at end of file diff --git a/elenasrc3/dpa/dpa_session.h b/elenasrc3/dpa/dpa_session.h index 9e758287a..4c0dd35d1 100644 --- a/elenasrc3/dpa/dpa_session.h +++ b/elenasrc3/dpa/dpa_session.h @@ -9,12 +9,40 @@ #ifndef DPA_SESSION_H #define DPA_SESSION_H +#include +#include + +#include "dpa_stream.h" +#include "dpa_queue.h" + namespace dpa { + using Payload = std::function; + using PayloadQueue = ThreadQueue; + + using ClosedHandler = std::function; + + //using RequestHandler = + // std::function; + // --- Session --- class Session { + ContentReader _reader; + PayloadQueue _inbox; + + std::thread _recvThread; + std::thread _dispatchThread; + + Payload getPayload(); + public: + //virtual void registerHandler(const TypeInfo* typeinfo, + // const RequestHandler& handler); + + void connect(); + void start(const ClosedHandler& onClose = {}); + Session(); virtual ~Session(); }; diff --git a/elenasrc3/dpa/dpa_stream.cpp b/elenasrc3/dpa/dpa_stream.cpp new file mode 100644 index 000000000..7401e3459 --- /dev/null +++ b/elenasrc3/dpa/dpa_stream.cpp @@ -0,0 +1,26 @@ +//--------------------------------------------------------------------------- +// E L E N A P r o j e c t: ELENA Debugger Adapater +// +// This file contains the DPA I/O class implementations +// +// (C)2024, by Aleksey Rakov +//--------------------------------------------------------------------------- + +#include "dpa_stream.h" + +using namespace dpa; + +ContentReader :: ~ContentReader() +{ + +} + +bool ContentReader :: isOpen() +{ + return false; +} + +void ContentReader :: close() +{ + +} diff --git a/elenasrc3/dpa/dpa_stream.h b/elenasrc3/dpa/dpa_stream.h new file mode 100644 index 000000000..99e7dc97f --- /dev/null +++ b/elenasrc3/dpa/dpa_stream.h @@ -0,0 +1,31 @@ +//--------------------------------------------------------------------------- +// E L E N A P r o j e c t: ELENA Debugger Adapater +// +// This file contains the DPA I/O class declarations +// +// (C)2024, by Aleksey Rakov +//--------------------------------------------------------------------------- + +#ifndef DPA_STREAM_H +#define DPA_STREAM_H + +namespace dpa +{ + //using RequestHandler = + // std::function; + + // --- ContentReader --- + class ContentReader + { + + public: + bool isOpen(); + + void close(); + + ContentReader() = default; + virtual ~ContentReader(); + }; +} + +#endif \ No newline at end of file diff --git a/elenasrc3/engine/windows/winevents.h b/elenasrc3/engine/windows/winevents.h new file mode 100644 index 000000000..2ceb2d07d --- /dev/null +++ b/elenasrc3/engine/windows/winevents.h @@ -0,0 +1,69 @@ +//--------------------------------------------------------------------------- +// E L E N A P r o j e c t: ELENA Engine +// +// This file contains the Win32 event template class +// (C)2021-2024, by Aleksey Rakov +//--------------------------------------------------------------------------- + +#ifndef WIN32EVENT_H +#define WIN32EVENT_H + +#include + +namespace elena_lang +{ + // --- EventManager --- + template class EventManager + { + HANDLE _events[EventCount]; + + public: + void init(T startEvent) + { + for (T i = 0; i < EventCount; i++) + _events[i] = CreateEvent(nullptr, TRUE, i == startEvent ? TRUE : FALSE, nullptr);; + } + + void setEvent(T event) + { + SetEvent(_events[event]); + } + + void resetEvent(T event) + { + ResetEvent(_events[event]); + } + + int waitForAnyEvent() + { + return WaitForMultipleObjects(EventCount, _events, FALSE, INFINITE); + } + + bool waitForEvent(T event, int timeout = INFINITE) + { + return (WaitForSingleObject(_events[event], timeout) == WAIT_OBJECT_0); + } + + void close() + { + for (T i = 0; i < EventCount; i++) { + if (_events[i]) { + CloseHandle(_events[i]); + _events[i] = nullptr; + } + } + } + + EventManager() + { + for (T i = 0; i < EventCount; i++) + _events[i] = nullptr; + } + virtual ~EventManager() + { + close(); + } + }; +} + +#endif \ No newline at end of file diff --git a/elenasrc3/ide/ideversion.h b/elenasrc3/ide/ideversion.h index d6ac43e9e..aeab83c4c 100644 --- a/elenasrc3/ide/ideversion.h +++ b/elenasrc3/ide/ideversion.h @@ -1,2 +1,2 @@ -#define IDE_REVISION_NUMBER 12 +#define IDE_REVISION_NUMBER 13 diff --git a/elenasrc3/ide/vs/elide.vcxproj b/elenasrc3/ide/vs/elide.vcxproj index f591cbee1..f23c48619 100644 --- a/elenasrc3/ide/vs/elide.vcxproj +++ b/elenasrc3/ide/vs/elide.vcxproj @@ -182,6 +182,7 @@ + diff --git a/elenasrc3/ide/windows/win32debugprocess.cpp b/elenasrc3/ide/windows/win32debugprocess.cpp index 517996776..5fc202bc4 100644 --- a/elenasrc3/ide/windows/win32debugprocess.cpp +++ b/elenasrc3/ide/windows/win32debugprocess.cpp @@ -112,46 +112,6 @@ BOOL WINAPI debugEventThread(DebugControllerBase* controller) return TRUE; } -// --- DebugEventManager --- - -void DebugEventManager :: init() -{ - _events[DEBUG_ACTIVE] = CreateEvent(nullptr, TRUE, TRUE, nullptr); - _events[DEBUG_CLOSE] = CreateEvent(nullptr, TRUE, FALSE, nullptr); - _events[DEBUG_SUSPEND] = CreateEvent(nullptr, TRUE, FALSE, nullptr); - _events[DEBUG_RESUME] = CreateEvent(nullptr, TRUE, FALSE, nullptr); -} - -void DebugEventManager :: setEvent(int event) -{ - SetEvent(_events[event]); -} - -void DebugEventManager :: resetEvent(int event) -{ - ResetEvent(_events[event]); -} - -bool DebugEventManager :: waitForEvent(int event, int timeout) -{ - return (WaitForSingleObject(_events[event], timeout) == WAIT_OBJECT_0); -} - -int DebugEventManager :: waitForAnyEvent() -{ - return WaitForMultipleObjects(MAX_DEBUG_EVENT, _events, FALSE, INFINITE); -} - -void DebugEventManager :: close() -{ - for (int i = 0; i < MAX_DEBUG_EVENT; i++) { - if (_events[i]) { - CloseHandle(_events[i]); - _events[i] = nullptr; - } - } -} - // --- Win32ThreadContext --- Win32ThreadContext :: Win32ThreadContext(HANDLE hProcess, HANDLE hThread) @@ -358,7 +318,7 @@ void Win32DebugProcess::ConsoleHelper :: printText(const char* s) { HANDLE output_handle = GetStdHandle(STD_OUTPUT_HANDLE); - WriteConsoleA(output_handle, s, getlength(s), 0, 0); + WriteConsoleA(output_handle, s, getlength_pos(s), 0, 0); } void Win32DebugProcess::ConsoleHelper :: waitForAnyKey() @@ -486,7 +446,7 @@ void Win32DebugProcess :: processEnd() } } -void Win32DebugProcess :: processEvent(size_t timeout) +void Win32DebugProcess :: processEvent(DWORD timeout) { DEBUG_EVENT event; diff --git a/elenasrc3/ide/windows/win32debugprocess.h b/elenasrc3/ide/windows/win32debugprocess.h index 9ccb72000..72ed22815 100644 --- a/elenasrc3/ide/windows/win32debugprocess.h +++ b/elenasrc3/ide/windows/win32debugprocess.h @@ -9,33 +9,12 @@ #define WIN32DEBUGPROCESS_H #include "idecommon.h" -#include +#include "windows/winevents.h" namespace elena_lang { // --- DebugEventManager --- - class DebugEventManager - { - HANDLE _events[MAX_DEBUG_EVENT]; - - public: - void init(); - void setEvent(int event); - void resetEvent(int event); - int waitForAnyEvent(); - bool waitForEvent(int event, int timeout); - void close(); - - DebugEventManager() - { - for (int i = 0; i < MAX_DEBUG_EVENT; i++) - _events[i] = nullptr; - } - ~DebugEventManager() - { - close(); - } - }; + typedef EventManager DebugEventManager; class Win32DebugProcess; struct Win32BreakpointContext; @@ -159,7 +138,7 @@ namespace elena_lang bool startProcess(const wchar_t* exePath, const wchar_t* cmdLine, bool withPersistentConsole); void continueProcess(); - void processEvent(size_t timeout); + void processEvent(DWORD timeout); void processException(EXCEPTION_DEBUG_INFO* exception); void processStep(); void processEnd(); @@ -167,7 +146,7 @@ namespace elena_lang public: void initEvents() override { - _events.init(); + _events.init(DEBUG_ACTIVE); } void setEvent(int event) override { diff --git a/elenasrc3/ldbg/ldbg_common.h b/elenasrc3/ldbg/ldbg_common.h new file mode 100644 index 000000000..ed7a820be --- /dev/null +++ b/elenasrc3/ldbg/ldbg_common.h @@ -0,0 +1,28 @@ +//--------------------------------------------------------------------------- +// E L E N A P r o j e c t: ELENA command-Line Debugger Adapter +// +// This file contains LDBG comment declaration +// +// (C)2024, by Aleksey Rakov +//--------------------------------------------------------------------------- + +#ifndef LDBG_COMMON +#define LDBG_COMMON + +#if defined(_MSC_VER) + +#include "windows\winevents.h" + +#else + +#endif + +namespace elena_lang +{ + constexpr auto LDBG_EVENT_COUNT = 1; + constexpr auto LDBF_CONFIGURED = 0; + + typedef EventManager DPAEventManager; +} + +#endif // LDBG_COMMON diff --git a/elenasrc3/ldbg/ldbg_const.h b/elenasrc3/ldbg/ldbg_const.h index eb7fd79e5..43d78ac60 100644 --- a/elenasrc3/ldbg/ldbg_const.h +++ b/elenasrc3/ldbg/ldbg_const.h @@ -1 +1 @@ -#define LDBG_REVISION_NUMBER 0x0001 +#define LDBG_REVISION_NUMBER 0x0002 diff --git a/elenasrc3/ldbg/ldbg_session.cpp b/elenasrc3/ldbg/ldbg_session.cpp index 91ca8a3ba..e6877fe69 100644 --- a/elenasrc3/ldbg/ldbg_session.cpp +++ b/elenasrc3/ldbg/ldbg_session.cpp @@ -15,7 +15,7 @@ using namespace elena_lang; DPASessionWrapper :: DPASessionWrapper() { - + _events.init(-1); } DPASessionWrapper :: ~DPASessionWrapper() @@ -26,10 +26,26 @@ DPASessionWrapper :: ~DPASessionWrapper() void DPASessionWrapper :: prepare() { _session = new dpa::Session(); + + // The ConfigurationDone request is made by the client once all configuration + // requests have been made. + + //session->registerHandler([&](const dap::ConfigurationDoneRequest&) { + // configured.fire(); + // return dap::ConfigurationDoneResponse(); + // }); + +} + +void DPASessionWrapper :: bind() +{ + _session->connect(); } void DPASessionWrapper :: run() { - // Wait for the ConfigurationDone request to be made. + _session->start(); + // Wait for the ConfigurationDone request to be made. + _events.waitForEvent(LDBF_CONFIGURED); } diff --git a/elenasrc3/ldbg/ldbg_session.h b/elenasrc3/ldbg/ldbg_session.h index c4df827a7..8a8015d61 100644 --- a/elenasrc3/ldbg/ldbg_session.h +++ b/elenasrc3/ldbg/ldbg_session.h @@ -10,15 +10,19 @@ #define LDBG_SESSION_H #include "dpa_session.h" +#include "ldbg_common.h" namespace elena_lang { class DPASessionWrapper { + DPAEventManager _events; + dpa::Session* _session; public: void prepare(); + void bind(); void run(); DPASessionWrapper(); diff --git a/elenasrc3/ldbg/vs/ldbg.vcxproj b/elenasrc3/ldbg/vs/ldbg.vcxproj index 59c821d92..307645f1b 100644 --- a/elenasrc3/ldbg/vs/ldbg.vcxproj +++ b/elenasrc3/ldbg/vs/ldbg.vcxproj @@ -101,6 +101,7 @@ WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true ..\..\common;..\..\engine;..\..\dpa;..\windows;..;%(AdditionalIncludeDirectories) + stdcpp17 Console @@ -137,6 +138,7 @@ _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true ..\..\common;..\..\engine;..\..\dpa;..\windows;..;%(AdditionalIncludeDirectories) + stdcpp17 Console @@ -167,14 +169,17 @@ + + + + - diff --git a/elenasrc3/ldbg/windows/ldbg.cpp b/elenasrc3/ldbg/windows/ldbg.cpp index 65b102626..417e692c0 100644 --- a/elenasrc3/ldbg/windows/ldbg.cpp +++ b/elenasrc3/ldbg/windows/ldbg.cpp @@ -25,6 +25,7 @@ int main() DPASessionWrapper session; session.prepare(); + session.bind(); session.run(); return 0;