








点command pallete,一顿选择,可以自动生成一个.vscode文件夹和它下面的launch.json文件,改成需要的programe/cwd这些,在调试dlsim时发现,有些问题。
例如,uint未定义,NB_ANTENNAS_TX未定义。
感觉编译已经把这些编进debug info里了,但vs code执行自己那个debug框架时没有识别出来。
按照网络上的方法,在CMakeLists.txt加了add_compile_options(-g3),也不行。。。
发现CMAKE_C_FLAGS_DEBUG还是g,用了set(CMAKE_C_FLAGS_DEBUG, " -g3")才改成g3,但vs code调试还是不行。。。
而且CMAKE_C_FLAGS不能随便修改
CMAKE_C_FLAGS: -gdwarf-2 -mcpu=native -lgcc -lrt -march=native -pipe -fPIC -Wall -fno-strict-aliasing -rdynamic -Wno-packed-bitfield-compat -std=gnu11 -funroll-loops
还需要再研究吧
始终报错uint未定义,NB_ANTENNAS_TX未定义,但好像能够单步调试了,需要保证launch.json和tasks.json基本正确吧。
还有,用不同的target,如nr_pbchsim、nr_dlsim,需要同时改动launch.json和tasks.json(它们里面都需要设置执行程序),否则会出现奇怪的问题。。。而且这些问题很难确认,因为对json文件的解释是内置在vs code里的。
用vs code debugging是,有时main函数开头就出错(segmentation fault):
1)可能是所谓的“野指针”,可能是切换不同的target导致的,此时,可以删除ran_build/build文件夹,重新生成target
2)后续发现还是会出错,最终百度了下,发现是代码启动了ASon机制,在main函数开头就进行了参数检验,导致vs code报错,百度写的:
您的程序崩溃并非由 -U 参数格式或代码逻辑错误引起,而是由 AddressSanitizer (ASan) 与 VS Code 调试环境不兼容 导致的。具体来说:
ASan 初始化冲突:您的代码中定义了 __asan_default_options() 函数,表明程序编译时启用了 ASan 内存检测工具。ASan 会在 main 函数执行之前进行复杂的运行时初始化,包括拦截内存分配函数、设置影子内存等。
调试器信号处理冲突:当您设置 "stopAtEntry": true 时,GDB 会在程序入口点(通常是 _start 或 main)暂停。然而,ASan 的初始化代码在 main 之前运行,可能会触发内部信号(如 SIGSEGV),这些信号被 GDB 捕获并中断,导致程序无法正常完成初始化。
环境变量配置问题:虽然您已经配置了 ASAN_OPTIONS,但 "stopAtEntry": true 与 ASan 的冲突是更根本的问题。
代码里的确在main函数前就有一个参数检查:
const char *__asan_default_options()
{
/* don't do leak checking in nr_ulsim, not finished yet */
return "detect_leaks=0";
}
3)后面还是出现了main函数开头就出错,当跑vs code的debugging时,但直接运行不会报错。百度提示两者不一致,可能跑的target不一样,于是直接运行时用的是vs code debugging生成的target,并echo $?,发现也会有exit(1)的现象,说明此时直接运行和vs code debugging的结果一致,都有exit(1),至于为何vs code debugging开始就exit(1),可能是ASon在main之前就进行了一些操作吧,并给vs code发了信号,vs code捕获到该信号就退出了。百度提示用gdb(模拟vs code debugging效果)来打印一些退出信息,包括gdb break exit, gdb bread abort,bt等,但打印信息很少。后来觉得是-U 3 0 0 2这种参数输入导致了野指针的问题。。。先去除掉-U参数试验
4)通过百度,知道OAI的vs code segmentation fault问题是很多人碰到的。。。用了很多方法都不行,后来偶尔一次就好了,不知道怎么好的。。。总的来说,只知道问题原因,不知道如何解决的,问题原因是:vs code在debug时内部启动了一些初始化流程,对全局变量和静态函数,会调用strtol函数,导致对野指针的访问,于是在main函数开始前就崩溃了。但如何避免这种野指针,还是没找到办法,毕竟封装在vs code里的,而且在main函数前,只是在debug console窗口里看到strtol报错的信息而已。。。网络上很多人的解法也大多是对launch.json做一些限制,避免vs code启动初始化流程带来的影响。。。感觉OAI代码本身不是在vs code里调制的。。。还有,感觉编译还是在不用vs code提供的preLaunchTask脚本,而是手动在终端里编译,preLaunchTask调用tasks.json,里面的参数跟手动的可能不一致。。。还有,全局变量有些是指针,最好赋值成NULL,以防万一吧
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。