Wyświetlenie std::string w podpowiedziach debuggera

0

Rozwiązanie: https://github.com/davenger/libcxx-pretty-printers
(fork ze wsparciem dla clang 15)

Nie potrafię zmusić VSCode aby w podpowiedziach po umieszczeniu kursora myszy nad zmienna wyświetli się wartość std::string w w wersji dla ludzi

int main(int argc, char *argv[])
{
    std::string koza{"koza"};
    spdlog::info("{}",koza);

screenshot-20230330081508.png

konfiguracja GDB

"setupCommands": [
  {
    "description": "Enable pretty-printing for gdb",
    "text": "-enable-pretty-printing",
    "ignoreFailures": false
  },

polecenie w konsoli GDB p koza (print koza)

-exec p koza
$2 = {static __endian_factor = 2, __r_ = {<std::__1::__compressed_pair_elem<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep, 0, false>> = {__value_ = {{__l = {{__is_long_ = 0, __cap_ = 209332974980}, __size_ = 1375840, __data_ = 0x14fe50 "p\022���\177"}, __s = {{__is_long_ = 0 '\000', __size_ = 4 '\004'}, __padding_ = 0x14fe01 "koza", __data_ = "koza\000\000\000`�\024\000\000\000\000\000P�\024\000\000\000\000"}, __r = {__words = {418665949960, 1375840, 1375824}}}}}, <std::__1::__compressed_pair_elem<std::__1::allocator<char>, 1, true>> = {<std::__1::allocator<char>> = {<std::__1::__non_trivial_if<true, std::__1::allocator<char> >> = {<No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, static npos = 18446744073709551615}

jedyne co działa to dodanie w watch koza.c_str()

Moja platforma to msys2, clang 15 , Windows 10

Powinno to wyglądać tak (użyłem eksperymentalnie lldb)
screenshot-20230330082742.png
lldb na Windows jest trochę nieużywalny bo szybko sie wysypuje

0
Adamek Adam napisał(a):

Nie potrafię zmusić VSCode aby w podpowiedziach po umieszczeniu kursora myszy nad zmienna wyświetli się wartość std::string w w wersji dla ludzi

To zawsze był problem, do różnych IDE/debugerów się robiło różne nakładki / patche / konfiguracje *)
Do VSCode nie wiem.

*) dla mnie jeden z pięciuset siedemnastu powodów do wielkiej mojej miłości do C++

2

NPos wygląda jak ascii litery :>

Jako że pewnie nie znasz jak działają obiekty w C++ to ci powiem, że to są zwykłe struktury i mają zewnętrze funkcje.

std string, ma jak vektor w pierwszym w zależności od architektury 8 bajtach wskaźnik na strukturę, która zawiera tablicę czyli w tym przypadku stringa.

A że ci niepoprawnie pokazuje vscode to nie wiem, może jest jak właściciel.

0

Rozwiązanie: https://github.com/davenger/libcxx-pretty-printers
(fork ze wsparciem dla clang 15)

0

Integracja z VSCode w taki sposób

      {
           "name": "gdb",
           "type": "cppdbg",
           "request": "launch",
           "program": "${command:cmake.launchTargetPath}",
           "args": [],
           "stopAtEntry": false,
           "cwd": "${command:cmake.launchTargetDirectory}",
           "environment": [],
           "externalConsole": false,
           "MIMode": "gdb",
           "miDebuggerPath": "gdb",
           "setupCommands": [
               {
                   // enable libcxx-pretty-printers in launch.json
                   "description": "Enable pretty-printing for gdb",
                    "text": "python import sys; sys.path.insert(0, 'c:/libcxx-pretty-printers/src'); from libcxx.v1.printers import register_libcxx_printers; register_libcxx_printers (None)",
                   "ignoreFailures": false
               },
               {
                   "description": "Enable pretty-printing for gdb",
                   "text": "-enable-pretty-printing",
                   "ignoreFailures": false
               }
           ]
       },

1 użytkowników online, w tym zalogowanych: 0, gości: 1