Visual Studio Code:gdb:无法访问地址的内存

Visual Studio Code: gdb: cannot access memory at adress

提问人:Victor 提问时间:10/12/2023 更新时间:10/12/2023 访问量:88

问:

我无法通过 VSCode 使用 gdb 调试 C++ 共享库。我的所有断点都处于非活动状态。当将鼠标悬停在它们上时,它会说“无法读取地址的内存......”。不过,库的符号已加载。
我仍然可以在控制台中运行gdb来调试我的库。我可以成功设置断点,程序会按预期暂停断点。

我用makefile制作库。编译字符串如下:

/opt1/gcc/bin/g++ -c -DPTR_RESTRICT= -shared -fPIC -O0 -g -DOURDEBUG1 -ggdb api.cpp -o api.o
/opt1/gcc/bin/g++ -c -DPTR_RESTRICT= -shared -fPIC -O0 -g -DOURDEBUG1 -ggdb dllmain.cpp -o dllmain.o

链接字符串如下:

/opt1/gcc/bin/g++ api.o dllmain.o .-L/opt1/gcc/bin/lib64 -nodefaultlibs -O0 -g -DOURDEBUG1 -ggdb -shared -fPIC -ldl -o mydll.so

我尝试通过两种方式在 VSCode 中创建启动目标。

首先,我刚刚打开“launch.json”并单击“添加配置”按钮。然后我选择了“C/C++:(gdb)附加”。VSCode 创建了以下代码:

        {
            "name": "(gdb) Attach",
            "type": "cppdbg",
            "request": "attach",
            "program": "/home/adminl/Project/mylib.so",
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }

我也尝试自己创建配置:

        {
            "name": "(gdb) Attach 2",
            "processId": "9814",
            "type": "cppdbg",
            "program": "/home/adminl/Project/mylib.so",
            "request": "attach"
        }

但没有成功。可能是什么问题?

C++ Linux visual-studio-code 调试 gdb

评论

3赞 n. m. could be an AI 10/12/2023
共享库(通常)不是程序,不能单独运行或调试。您需要一个链接到此库的可执行文件。如何从控制台运行 gdb?
0赞 Victor 10/12/2023
是的,你是对的,图书馆不是一个程序。实际上,我运行了一个程序,它通过“dlopen”函数加载库。我只需通过命令从控制台运行 gdb,其中 pId 是加载我的库的进程的 ID。gdb -p pId
0赞 n. m. could be an AI 10/12/2023
来自 MS 指南:“程序(必需)指定调试器将启动或附加到的可执行文件的完整路径。不是您的 .so 文件,而是您附加到的进程的实际可执行文件。附加后,进程 dl 打开共享库,您应该会看到断点已激活。
0赞 Victor 10/12/2023
哇,奏效了,谢谢!但是,我为什么要定义我所附加的程序呢?我的意思是,当我在控制台中运行 gdb 时。我只指定进程 ID。如果我在vscode中运行gdb,我还必须选择进程id。有没有办法不指定程序?
0赞 n. m. could be an AI 10/12/2023
可执行文件可以从进程 ID 中确定,因此原则上可以将此字段设置为可选字段。我不知道为什么 VSC 需要它..

答: 暂无答案