摘要: 文章分为三部分,代码获取/编译/运行。 第一步获取代码,打开cmd执行以下指令即可 set WORKSPACE=E:\webrtc mkdir %WORKSPACE% cd /d %WORKSPACE% git clone --depth 1 https://chromium.googlesourc 阅读全文
posted @ 2019-12-22 18:28 云中双月 阅读(8713) 评论(5) 推荐(1) 编辑
摘要: 本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,无cpu占用(cpu仅用作网络数据接收和从数据入显存,因此几乎看不出占用),且代码和引用精简(无其他托管和非托管的dll依赖,更无需安装任何插件,你的程序完全 阅读全文
posted @ 2019-11-23 16:26 云中双月 阅读(4574) 评论(15) 推荐(9) 编辑

  我们在嵌入式Linux开发过程中经常会遇到一个问题,就是程序崩溃后不知道具体位置。因为我们发布到生产环境的一般是没有调试符号的(使用strip或编译时加-s参数,CMake生成的编译指令中的-O3也会造成调试符号丢失),毕竟嵌入式的存储都比较有限,肯定是需要剥离调试符号的。

  另外一个经常遇到的问题是Release版本会崩溃,Debug不崩溃,因为-g参数有时候会让编译器对一些变量进行默认赋值,这又给我们调试增加难度:上Debug吧空间不允许,运行速度也不够(没有-O了);上Release,又崩溃……

 

  接下来我为大家提供一个思路,可以在无调试符号的情况下定位崩溃位置。

  首先我们准备一个简单的测试代码,让他崩溃一下。

#include <stdio.h>
#include <stdlib.h>

int func1() {
printf("%d\n",__LINE__);
    int *p = NULL;
    *p = 0;
printf("%d\n",__LINE__);
return *p;
}

void func2() {
printf("%d\n",__LINE__);
func1();
printf("%d\n",__LINE__);
}

void func3() {
printf("%d\n",__LINE__);
func2();
printf("%d\n",__LINE__);
}

int main() {
func3();
    return 0;
}
//gcc -s -O3 main.c

  我们编译执行后,毋庸置疑,它会崩溃。

   此时如果我们用gdb调试,当然是无法定位问题,因为没有调试符号,它无法backtrace,直接给你两个问号。

 

  接下来重头戏来了,我们使用Ida Pro来试试定位!

  首先我们使用gdb的一些命令获取崩溃的模块(是主程序还是某个so),以及崩溃的代码位置。

   我们使用info proc map指令获取崩溃的代码所在模块,确定是我们主程序a.out代码崩溃的(这个很重要,咱作为程序员,一定要用事实说话,不可以猜)

  然后我们通过x/16x $pc来获取崩溃的汇编代码(这个指令就是获取是哪句汇编代码导致程序崩溃的)。

  (当然,一般崩溃就是几个字节的一句汇编导致的,用不了16个字节,不过我们要做特征匹配)

 

  紧接着,我们打开16进制查看工具,搜索这组16进制的位置

   可以看到,汇编代码在整个进程的偏移量是0x1242

  我们打开Ida Pro,装载a.out

   在Hex View界面找到0x1242,鼠标点击,会得到一个函数名和偏移量。

  我们在左侧的Functions窗格双击对应函数名可以进入

   (有时候这个函数比较复杂,我们在这种图形下不好定位,可以右键切换到Text View进行查看)

  

   当然,走到这里之后我能给大家的参考就少了。接下来就要靠大家自己联系上下文汇编找到报错的代码对应的源码了。

 

  也可以按F5进入伪代码窗口(伪代码是Ida Pro提供的汇编转c语言的功能,不一定完全对,但很大程度上提供了帮助)

 

  最后更新时间 2024-11-02 17:49:50

posted @ 2024-11-02 17:52 云中双月 阅读(246) 评论(0) 推荐(1) 编辑
摘要: 首先我们要明白,“时间”和“时区”是两个东西。 时间是指从某个时间点开始到另一个时间点经过的“长度”,是“纵向”距离,一般在linux系统内有两个主要的时间,一是始于1970年(unix元年)至今的距离,二是系统启动后至今的距离。前者一般是由不断电的硬件维护(RTC)或者其他专门服务器授时(NTP) 阅读全文
posted @ 2024-08-04 14:15 云中双月 阅读(565) 评论(0) 推荐(1) 编辑
摘要: 首先我们需要准备一个大小写敏感的文件夹。 然后拉取代码,并且执行代码的先决条件脚本。 注意,如果过程中某项条件不符,你可能要临时修复。 假如下图的组件判定失败(即出现ok=>fail) 那么你就需要执行sudo apt install -y python3-distutils来修复。 然后执行mak 阅读全文
posted @ 2023-02-08 17:28 云中双月 阅读(800) 评论(0) 推荐(0) 编辑
摘要: 最近遇到一个需求,或者说是一个用户现场问题。 我们设备先安装,设置dhcp模式获取ip进行联网,后来又安装了其他设备,但该设备是手动设置的静态ip地址,正好与我们设备冲突,造成网络故障。 那我们就需要有一个能够检测ip冲突的方法,这个可以使用ARP协议的ACD功能(Address Conflict 阅读全文
posted @ 2022-09-28 19:30 云中双月 阅读(1832) 评论(2) 推荐(3) 编辑
摘要: 去年我尝试进行研究生笔试复习,直至考试前一天看打卡天数,是211天,我记得很清楚。 这两百余天,白天上班晚上学习,真的很累。考试时觉得有一定信心。 分数出来175,我是报考工程管理,历年最高分数也才175,一般隔年波动不超过5分,我认为自己能过线了。 结果国家线出来189,因为去年报考人数470万, 阅读全文
posted @ 2022-03-13 21:02 云中双月 阅读(111) 评论(0) 推荐(2) 编辑
摘要: 首先我们需要安装Remote Development插件(这个Remote-WSL一定要保证是装上的哦)。 然后我们先连接到WSL。 (第一次进入远程模式,会慢一些,需要下载一些组件) (如果你打开这个远程界面,发现没有wsl项,也不要急,点击左下角,然后选择第一项即可,如下图) 再安装C++相关插 阅读全文
posted @ 2021-08-06 09:44 云中双月 阅读(2058) 评论(1) 推荐(0) 编辑
摘要: 本系列的最后一篇,讲解收发音视频数据。 贴出最终效果: 其实很简单,直接调用writeFrame即可,如下图: 当然,这是部分代码,完整代码在下面,展开可见: 1 #include "com/amazonaws/kinesis/video/webrtcclient/Include.h" 2 #inc 阅读全文
posted @ 2020-11-09 11:36 云中双月 阅读(3252) 评论(9) 推荐(1) 编辑
摘要: 先贴上效果图以及操作路径。 操作路径为:启动信令服务器,配置浏览器关闭mDNS,双端登录,浏览器端邀请。最终连接成功建立,我们通过datachannel成功通信 (关闭mDNS是因为谷歌浏览器隐藏了局域网ip,我们暂时没写解析代码,配置方式为进入chrome://flags/#enable-webr 阅读全文
posted @ 2020-11-06 10:51 云中双月 阅读(3420) 评论(3) 推荐(0) 编辑
摘要: 最近两年,我对于网络知识,包括底层协议学习比较多,webrtc这种几乎是使用到了所有层面网络协议的技术也逐渐进入我的视野。 之前我提出了两种在嵌入式设备上实现webrtc的方式,一是用官方代码,然后改编译链,但是这条路是留给c++高玩的,因为它的代码是用最新的c++17写的,你必须重写adm(Aud 阅读全文
posted @ 2020-10-27 15:55 云中双月 阅读(10824) 评论(1) 推荐(2) 编辑
点击右上角即可分享
微信分享提示