xmake-io / xmake-vscode

🍩 A XMake integration in Visual Studio Code
https://xmake.io
Apache License 2.0
229 stars 54 forks source link

Cannot debug when using liburing #139

Closed fonqL closed 1 year ago

fonqL commented 1 year ago

Xmake 版本

2.7.1

操作系统版本和架构

Ubuntu 22.04 on Win10 WSL

描述问题

xmake.lua

add_rules("mode.debug", "mode.release")
set_languages("c++17")
set_toolchains("clang")
set_warnings("all")

add_requires("liburing")
add_packages("liburing")

target("demo")
  set_kind("binary")
  add_files("src/main.cpp")

main.cpp

#include <iostream>
int main() {
    std::cout << "1234\n";
}

可以运行,可以命令行调试(xmake run -d),但是不能在vscode里调试(即点击状态栏调试按钮或按F5)

.../demo/build/linux/x86_64/debug/demo: error while loading shared libraries: liburing.so.2: cannot open shared object file: No such file or directory

相关:

$ ls ~/.xmake/packages/l/liburing/2.1/2e6104ac1acb47ddb318f33dd2d128ee/lib
liburing.a  liburing.so  liburing.so.2  liburing.so.2.1.0  pkgconfig

settings.json

"xmake.customDebugConfig": {
        "type": "lldb",
        "request": "launch",
        "name": "Debug",
    }

期待的结果

可以调试

工程配置

No response

附加信息和错误日志

No response

waruqi commented 1 year ago

这个你要自己调下插件了,看看 runenvs 里面是否少了部分变量

https://github.com/xmake-io/xmake-vscode/blob/master/assets/target_runenvs.lua

xmake l assets/target_runenvs.lua targetname

https://github.com/xmake-io/xmake-vscode/blob/master/src/xmake.ts#L829-L843

fonqL commented 1 year ago

无论是调试插件还是命令行输入,xmake l assets/target_runenvs.lua demo 都输出

[]
__end__

https://github.com/xmake-io/xmake-vscode/blob/3751e4a627bc05d845e5507e3646ec9cbc0fb6e8/assets/target_runenvs.lua#L48 这一行返回两个空map。。所以envs还是空集后面就到print("[]")

https://github.com/xmake-io/xmake/blob/1496036a67cf746df72b7140096e08b6913a3d9d/xmake/modules/private/action/run/make_runenvs.lua#L67 target:get("runenvs") 和之后的target:get("runenvs")都返回空。。

在target_runenvs.lua打印了一下target ( print(target) ) target.txt target:get似乎只在第3669行的_INFO = {...}执行查找,比如target:get("packages"), target:get("warnings")是有结果的

waruqi commented 1 year ago

会从这里找

https://github.com/xmake-io/xmake/blob/1496036a67cf746df72b7140096e08b6913a3d9d/xmake/modules/private/action/run/make_runenvs.lua#L46-L50

既然 xmake run 可以跑,对比下两边的差异

fonqL commented 1 year ago

https://github.com/xmake-io/xmake/blob/1496036a67cf746df72b7140096e08b6913a3d9d/xmake/modules/private/action/run/make_runenvs.lua#L85 ?但是我是linux平台啊

waruqi commented 1 year ago

linux 看这里 https://github.com/xmake-io/xmake/blob/1496036a67cf746df72b7140096e08b6913a3d9d/xmake/actions/run/main.lua#L121

https://github.com/xmake-io/xmake-vscode/blob/d9cfd83236ac434ebdea105bd65d3e1d4c09c6c0/assets/target_runenvs.lua#L8-L17

fonqL commented 1 year ago

怎么给xmake debug。。本地没找到main.lua,是二进制分发吗(用apt+ppa装的)

waruqi commented 1 year ago

xmake l os.programdir 看下本地安装目录,有所有 lua 脚本

或者拉源码,切本地调试环境,

cd xmakesrc
git submodule update --init
make
source ./scripts/srcenv.profile
fonqL commented 1 year ago

https://github.com/xmake-io/xmake/blob/1496036a67cf746df72b7140096e08b6913a3d9d/xmake/actions/run/main.lua#L120-L156 在main.lua中,执行流程是:先get环境变量,再加入LD_LIBRARY_PATH,再执行代码,最后恢复旧的环境变量

而在target_runenvs.lua中,执行流程是:先get环境变量,再加入LD_LIBRARY_PATH,然后就恢复旧的环境变量,最后开启调试运行代码,没有环境变量LD_LIBRARY_PATH

fonqL commented 1 year ago

新出现一个最新1.7.7vscode 插件更新的问题(之前拉的1.7.6源码调试没问题)

点击下方状态栏的run按钮会自动重新构建,然而我只是想要运行

waruqi commented 1 year ago

新出现一个最新1.7.7vscode 插件更新的问题(之前拉的1.7.6源码调试没问题)

点击下方状态栏的run按钮会自动重新构建,然而我只是想要运行

那到底要怎么搞,也是蛋疼。。https://github.com/xmake-io/xmake-vscode/discussions/142

@owwkmidream

点击下方状态栏的run按钮会自动重新构建,然而我只是想要运行

不会 rebuild,只是 增量 build,如果之前编译过,不会去编译任何文件,只是显示个 build string

fonqL commented 1 year ago

那好像也不是不行。。之后有好的想法再提feature request吧。。

waruqi commented 1 year ago

https://github.com/xmake-io/xmake/blob/1496036a67cf746df72b7140096e08b6913a3d9d/xmake/actions/run/main.lua#L120-L156 在main.lua中,执行流程是:先get环境变量,再加入LD_LIBRARY_PATH,再执行代码,最后恢复旧的环境变量

而在target_runenvs.lua中,执行流程是:先get环境变量,再加入LD_LIBRARY_PATH,然后就恢复旧的环境变量,最后开启调试运行代码,没有环境变量LD_LIBRARY_PATH

跟恢复没关系,那个脚本只是为了 print envs 结果出来,恢复前,envs 已经取出来了

https://github.com/xmake-io/xmake-vscode/blob/d9cfd83236ac434ebdea105bd65d3e1d4c09c6c0/assets/target_runenvs.lua#L63

之后调试,会把envs 直接透传给 debugger,跟当前环境是否有 LD_LIBRARY_PATH 没任何关系。

只要确认 print 出有结果,不是空的就行,如果是空的,也跟这个恢复没啥问题,应该是其他问题

waruqi commented 1 year ago

build run 那个我改进了下,具体看 https://github.com/xmake-io/xmake-vscode/discussions/142#discussioncomment-3760924

fonqL commented 1 year ago

跟恢复没关系,那个脚本只是为了 print envs 结果出来,恢复前,envs 已经取出来了

但就是没取出来啊 见我上面的评论 https://github.com/xmake-io/xmake-vscode/issues/139#issuecomment-1261706610

waruqi commented 1 year ago

没取出来也跟恢复envs没啥关系,是其他问题导致,得继续跟进去

如果是空的,也跟这个恢复没啥问题,应该是其他问题

fonqL commented 1 year ago

那问题出在哪呢,是make_runenvs还是target的生成呢 https://github.com/xmake-io/xmake-vscode/blob/a592193f985d6b3e5296755e9d6f2ce77c16e3f8/assets/target_runenvs.lua#L31

或者说空是正常情况?? 来点pre-condition或post-condition?

waruqi commented 1 year ago

大概知道原因了 这里面没把 envs 设置进去

https://github.com/xmake-io/xmake-vscode/blob/a592193f985d6b3e5296755e9d6f2ce77c16e3f8/assets/target_runenvs.lua#L47

waruqi commented 1 year ago

改了下,再试试

fonqL commented 1 year ago

。。原来问题是codelldb插件的“type”: "lldb"调试配置根本不接受environment属性。。在launch.json中写出来检查发现报黄了。。按左侧调试栏的按钮果然也显示找不到共享库路径。。 image 我知道的一个解法是改成

"env": {
    "LD_LIBRARY_PATH": "/home/fofo/.xmake/packages/l/liburing/2.1/2e6104ac1acb47ddb318f33dd2d128ee/lib",
},

可能是个breaking change,不知道有没有其他指定共享库路径的方法

另外一个work around就是改成用"type": "cppdbg"调试

waruqi commented 1 year ago

cppdbg 和 codelldb 的 env 配置格式不同?

fonqL commented 1 year ago

image image 而且改了后type: lldb确实可以成功调试

waruqi commented 1 year ago

这里又说 env {} 反而不行

https://stackoverflow.com/questions/29971572/how-do-i-add-environment-variables-to-launch-json-in-vscode

这个有官方文档么,envs 配置不是应该统一的么,为啥 lldb 和 cpptools 的 key 和格式还不同?

fonqL commented 1 year ago

。。我觉得vscode的调试就是以type为依据分发给相应的调试插件处理的吧,不同插件处理的属性就不一样 估计要去找插件的官方文档吧我猜 确实有些混乱了

codelldb的文档: https://github.com/vadimcn/vscode-lldb/blob/master/MANUAL.md#launching-a-new-process 里面就说用env而不是environment

waruqi commented 1 year ago

今天没空搞了,你可以直接提个 pr 过来帮忙搞下。

这里转下 targetRunEnvs 传入 env 就行了。 https://github.com/xmake-io/xmake-vscode/blob/c3195efcdba08a48ac5deefac7df32393ce117c5/src/debugger.ts#L82-L93

waruqi commented 1 year ago

改进过了 再试下

fonqL commented 1 year ago

已解决