gdb 调试崩溃产生的 core 文件

需求 程序崩溃后,希望知道程序到底是因为什么崩溃的,首先需要找到崩溃后的 core 文件,然后调试加载 core 文件。 解决 先在软件的目录寻找 core 文件,如果没有按照下面的步骤来处理。 确认开启了 core 查看当前允许的 core 文件的最大大小。 ulimit -c 设定固定值或者不限制, 单位是 KB ulimit -c 1024 ulimit -c unlimited 确认 core 文件路径 如果文件路径类似下面这样的,就说明 core 被系统转存了,需要专门导出 cat /proc/sys/kernel/core_pattern |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e 导出 core 导出需要使用 coredumpctl, 如果没有安装,使用如下命令: sudo apt install systemd-coredump 使用 coredumpctl, 查看崩溃的 pid, 如果显示的不完整,可以使用方向键来查看未完信息。 如果崩溃的 pid 为 1234, 并且导出的文件名为 core_2023 coredumpctl -o core_2023 dump 1234 加载 core 如果可执行文件名为 main, 崩溃文件为 core_2023....

2023-03-21 · 1 min · 88 words · RamLife

gdb list 显示指定文件或函数

需求 当多个文件编译后,需求调试的时候,需要 b 来打断点,但是前提是通过 list 翻到代码所在行。默认的 list 每次的行数太少,而且也不是一下子就能翻到。 解决 指定文件 可以直接指定源文件的某一行进行 list. 比如需要查看 a.cpp 的 100行。 gdb> list a.cpp:100 指定函数 可以直接指定查看某个函数,比如查看 Pack 这个函数。 gdb> list Pack 参考 gdb中list用法 GDB单步调试程序

2023-03-21 · 1 min · 29 words · RamLife

录屏软件简单使用

需求 想要把腾讯会议的培训教程录制下来,以后可以观看,又不希望通知其他与会者。 解决 使用 obs 这款软件就可以。 下载 使用 https://obsproject.com/ 这个网站,就可以下载了。 注意:这个是英文网站,下载免费。中文网站,下载收费 设置 在录制前,去设置中修改保存的位置,保证文件夹有足够的空间。 录制桌面 在左下第二个格, source 的左下角,点击 +, 选择 Display Capture, 就可以录制全桌面了。 Audio Mixer 里面是选择录制的音频 点击最右边的 start recording 即可开始录制。 注意:桌面上有啥,录制啥,所以如果这样录制的话,需要全程让腾讯会议在最前才可以 录制窗口 打开腾讯会议并且进入会议或者其他你想录制的软件,并且窗口最大化。 在 source 中新建选择 Window Capture, 就可以选择一个窗口进行录制。 保证 Audio Mixer 是 Desktop Audio, 并且最大。 把系统声音拉到最大。 点击 start recording 开始录制 可以点击系统声音最前面的静音图标,这样就不会影响办公。而且也不会影响到录制的声音。 打开其他你需要工作的软件即可做其他工作。 注意:一定要注意,千万千万不要把需要录制的腾讯会议的窗口给最小化了,否则就不能录制了。可以打开其他软件遮盖,但就是不能最小化 参考 OBS录屏安装与简单使用方法 在腾讯会议运行期间录屏,会被后台检测并发送警告给会议组织者?

2023-03-21 · 1 min · 56 words · RamLife

多维列表添加值时,多个位置被同时修改的错误

需求 今天使用 python 编写一个数据处理的脚本时,结果怎么都不对。经过反复调试,问题出现在使用 append 给多维列表添加值的时候,我需要的是只在指定的列表里面添加,结果多维列表的内部多个列表同时被添加值了。 解决 原因 这个错误有点莫名其妙,一开始我以为是我写错了,导致类似于 numpy 里面那样,对多维数组操作时,对高维操作时,会有多个地方被修改。 但是在自己检查之后发现,并不是这种情况。后来经过反复的调试和搜索后,终于确定原因所在。 原因其实还是在新建多维列表的地方,如下是我开始时候的写法: c1 = [] c2 = [] t = [] for i in range(0, 12): l = [c1, c2, t] out_data.append(l) 上面的写法看起来却是是新建了 12 * 3 的多维列表,但是隐藏的问题是,这样添加,其实添加的是 c1, c2, t 的引用,所以导致只要有一个变化了,其他的都会跟着变。 解决 只要修改创建多维列表的方法就可以了,比如这样: out_data = [ [ [] for j in range(3) ] for i in range(channel_num) ] 参考 Python 创建多维空列表 python初始化二维列表:{}.append({}) 与 {{}} * n python 二维列表(数组)赋值问题 python二维列表List修改其中一个数值,所有项数值都改变的问题。

2023-03-21 · 1 min · 70 words · RamLife

串口读取数据部分数据有错误

需求 在使用串口调试助手调试读写程序时,发现在开启定时 10ms 发送的情况下,接收到的数据有时候会不对。 解决 原因 经过反复调试,最终确定问题是 RS485 导致的问题。因为下面几个原因叠加导致: RS485 是半双工设备,同时只能收或者发。 串口调试助手,定时发送没有办法刚好完全避开程序的发送 所以,就出现了,当程序在发送时,串口调试助手也在发送,等到程序接收的时候,数据就不完整,或者有问题。 验证 验证也很简单: 程序只收不发,然后查看所有受到的数据,没有错误。 程序发送的间隔拉的很长,观察在发送间隔中的接收数据,也是没有错误的。 参考

2023-03-21 · 1 min · 18 words · RamLife

gn 使用细节

需求 在项目中使用 gn 时,会有很多各种各样的构建需求,本文是记录这些细节的实现方法。 解决 静态库 需求: 项目文件夹为 project, 静态库源文件目录为 project/protocol 静态库源文件分为两个文件, a.cpp, b.cpp 静态库名为 proto 解决: 在静态库目录下新建 BUILD.gn, 内容如下: static_library("proto") { sources = [ "a.cpp", "b.cpp", ] } 注意: 库名称 在项目目录下的 BUILD.gn, 新增内容如下: executable("test") { ... deps = [ "//protocol:proto", ] ... } *注意: 冒号前面是文件夹路径,冒号后面是 BUILD.gn 文件中的标识, 如果标识和文件夹名称一致,可以省略冒号及后面的部分。比如,文件夹是 abc, 生成的库也是 abc, 那么依赖这个地方可以直接写成 //abc 即可 * 参考 using gn build

2023-03-15 · 1 min · 60 words · RamLife

Linux 键盘输入读取

需求 读取二维码 DataMatrix 格式的扫码头是 usb 接口,通过键盘输入的形式输出数据。程序需要读取这些数据。 解决 设备信息 获取设备信息 键盘输入在 linux 当中属于 input 子系统,对应的设备号是 /dev/input/eventX, 如果希望知道自己的设备具体对应那个,可以使用下面这条命令来获取所有的输入设备信息。如果希望了解输入的更多内容,可以查看 https://www.kernel.org/doc/Documentation/input/input.txt cat /proc/bus/input/devices I: Bus=0019 Vendor=2454 Product=6575 Version=0010 N: Name="mtk-kpd" P: Phys= S: Sysfs=/devices/platform/mtk-kpd/input/input0 U: Uniq= H: Handlers=event0 B: PROP=0 B: EV=3 B: KEY=1c0000 0 0 0 I: Bus=0019 Vendor=0000 Product=0000 Version=0000 N: Name="ACCDET" P: Phys= S: Sysfs=/devices/virtual/input/input1 U: Uniq= H: Handlers=event1 B: PROP=0 B: EV=3 B: KEY=80 0 78 0 40c0000 0 0 0 I: Bus=0000 Vendor=0000 Product=0000 Version=0000 N: Name="hwmdata" P: Phys= S: Sysfs=/devices/virtual/input/input2 U: Uniq= H: Handlers=event2 B: PROP=0 B: EV=5 B: REL=2 分析设备信息 根据上面的输出信息,可以根据 Name 这一行大概找到自己的设备,如果希望知道设备支持的详细内容可以查看 EV 值,根据 /usr/include/linux/input-event-codes....

2023-03-14 · 8 min · 1570 words · RamLife

多进程如何使用单串口的方案

需求 数据处理的程序是多进程的,那么如何让多进程的处理程序使用硬件上的单个的串口呢? 解决 最适合的方法还是,把串口部分的程序独立出来,做成一个服务程序。 这个服务,对下是一条一条的把数据帧通过硬件串口进行收发。 这个服务,自身需要对数据进行一定的加工处理,比如按照指定的协议对数据帧进行编解码。 这个服务,对上可以使用队列,管道等进程间通讯的方式,把相关数据送到不同的进程中去。 当然如果多进程的处理功能特别简单,也可以考虑把这个处理的功能和串口二合一,然后通过多线程的方式去做。 参考 这个很有必要讨论讨论,我搞过一小段时间售货机,串口通信 多个进程间如何实现串口控制共享 linux两个进程同时打开串口,linux串口操作及设置详解

2023-03-13 · 1 min · 12 words · RamLife

crosses initialization of XXX

需求 今天修改了几行程序后,编译不通过,报错为 crosses initialization of. 解决 经过搜索和尝试,发现是 goto 语句引起的,但是也不单纯是 goto 引起的。主要是同时达到了下面两个条件。 变量定义并没有都放在函数的开始。 使用 goto 的语句下面,还有新定义的变量。 所以,编译器担心 goto 跳过这些新定义的变量可能导致程序执行的结果有问题,就报错了。解决也很简单,把使用 goto 语句下面新定义的变量移动到上面就可以了。 参考 goto语句引起的crosses initialization of XXX

2023-03-13 · 1 min · 25 words · RamLife

Linux 串口的配置和读写

需求 需要在 linux 中配置好串口,并且通过串口收发数据 解决 打开串口 打开串口直接使用 open 函数即可,需要注意的是, flag 中的参数 O_NOCTTY, O_NDELAY. O_NOCTTY:告诉Unix这个程序不想成为“控制终端”控制的程序,不说明这个标志的话,任何输入都会影响你的程序。 O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。但是在 man 中,是把 O_NDELAY 和 O_NONBLOCK 放在一起,并没有说明两者的区别,所以这这个参数的作用存疑。 open 时需要指定串口的串口号,比如 /dev/ttyS0 int OpenDevice(const char * dev) { int fd = 0; fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) { fprintf(stderr, "Can not open serial port %s", dev); return -1; } cout << "open " << dev << " Ok!" << endl; return fd; } if ((serial_fd = OpenDevice(kSerialName....

2023-03-13 · 4 min · 782 words · RamLife