Linux环境下段错误的产生原因及调试方法小结
博客园的一篇文章,对段错误原因和调试方法讲的还不错
sudo apt-get install --reinstall ubuntu-desktop
sudo reboot
vbox如果按ctrl+alt,就会切换到主机下,使用右边的ctrl(也叫HOST键)可以替代这个组合,即按 ‘右ctrl+f1’ 即可。
直接上代码
#include
#include
#include
#define getmem 3 //1,stack; 2,heap; 3,const
#if getmem == 1 //stack
char *GetString(void){
char array[6] = "hello";
return array;
}
#elif getmem == 2 //heap
char *GetString(void){
char *array;
char buf[6] = "hello";
array = malloc(sizeof(buf));
strcpy(array, buf);
return array;
}
#elif getmem == 3 //const
char *GetString(void){
char *array = "hello";
return array;
}
#endif
void main()
{
char *pstr = NULL;
pstr = GetString();
printf("%s\n", pstr);
}
运行会发现
栈在出了函数之后就不可用了,程序运行会出错
堆和常量,在出了函数后仍可被使用
strlen在没有发现 \0 前会一直查找下去,然后返回 \0 之前的字符长度。
所以如果用strlen查询不确定的字符串长度,可能导致意外的无限循环。
字符集(Character set)
字符的集合,每个字符集包含的字符个数不同,常见字符集:
ASCII字符集
GB2312字符集
BIG5字符集
GB18030字符集
Unicode字符集等
字符编码
比如UTF-8,就是Unicode字符集的编码方式
二者区别
字符集
是书写系统字母与符号的集合。
字符编码
则是将字符映射为一特定的字节或字节序列,是一种规则。
字符集和字符编码对应关系
字符集 | 字符编码 |
---|---|
ASCII | ASCII |
GB2312 | GB2312 |
GBK | GBK |
GB18030 | GB18030 |
Unicode | UTF-8、UTF-16、UTF-32 |
比如拷贝带有soft-link的so文件时, 加上-d参数就可以保留链接文件的属性了,而不会去复制了链接的原始库文件,命令如下:
cp -d libXXX.so* $DEST_DIR
\r
是回车,英文是Carriage Return
,简称CR
作用:使光标到行首
\n
是换行,英文是New Line
或者是Line Feed
,简称LF
,作用:换到新行
系统路径中如果有跟编译选项-L路径中的同名库,哪个更优先呢?优先级如下:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib;
5.默认的动态库搜索路径/usr/lib.
同时可以指定程序运行时,从哪个目录搜索动态库,具体是用 -rpath
选项,如:
-Wl,-rpath=/mnt/app/
1、利用curl下载http文件
curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
//62M
curl -OL http://xmp.down.sandai.net/xmp/XMPSetup6.1.7.810xmpdl.exe
//108M
curl -OL http://forspeed.rbread01.cn/down/VirtualBox-5.2.16-123759-Win.exe
//450M
curl -OL http://forspeed.rbread01.cn/down/newdown/4/26/VMwareworkstation.rar
释放 echo 3 > /proc/sys/vm/drop_caches
0:0是系统默认值,默认情况下表示不释放内存,由操作系统自动管理
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存
如果现在想让操作系统重新分配内存,那么设置drop_caches的值为0即可
如果定义指针的时候,指针指向一个有空间的数据,这时不需要分配空间;
如果要给指针赋值,则需要分配内存空间。
拨号还有NDIS、ECM,暂时没做介绍。
参考:https://blog.csdn.net/u010164190/article/details/79096184
1.Gobinet拨号
GOBI 高通Gobi无线宽带芯片技术,只需一个模块即可支持多种移动宽带网络和众多移动运营商.
高通公司称全新的芯片将基于Gobi 4G LTE无线基带、MDM9615和MDM9215。这种技术可以在FDD和TDD网络下进行LTE连接,同时支持HSPA+和EV-DO网络、2G/3G网络。这意味着用户可以在本地使用高速4G LTE网络,在其他地方使用3G网络。Gobi平台在MDM芯片组的基础上还提供了软件增强层,这样可以使用不同技术下的无线连接更简单。
2.QMI-WWAN协议拨号
QMI: Qualcom Message Interface
MSM: Mobile station mode
AP: Application Procesor
高通平台目前都是非对称多核心,最主要的是AP和Modem。
两个处理器怎么进行通信呢,我们把AP和Modem当作两个主机,问题就变得了很简单,TCP/IP协议不是一种非常成功的进程间跨主机通信方式。高通没有采用这种方式,但是借鉴了TCP/IP的框架设计。
Qualcomm MSM Interface,作用用于AP和BP侧的交互,通俗说法就是让设备终端TE(可以是手机,PDA,计算机)
对高通BP侧的AMSS系统进行操作,如调用函数,读取数据,设置其中的NV项等。
参考:http://blog.csdn.net/u012439416/article/category/7004974
3.ppp协议拨号:点对点协议
PPP(点到点协议)在拨号过程中用于MS和PC间数据交互、协商。在拨号流程的初期首先开启的就是PC和MS直接的PPP过程,在拨号成功后,还需要依靠PPP协议对IP包进行封装传输数据。
官网源码:https://ppp.samba.org
添加静态路由即可,命令如下(需管理员权限):
route add 172.16.80.0 mask 255.255.255.0 192.168.225.1 -p
查看路由信息
route print
删除静态路由
route delete 172.16.80.0 mask 255.255.255.0 192.168.225.1 -p
所有需要发往172.16.80.0/16
地址段的IP数据包,全部由192.168.225.1
路径转发。
-p
表示重启仍旧有效
格式就是`route add 目标网段 mask 掩码 下一跳地址`
目标网段必须是非直连网段,即172.16.80.*
中的*要是0
下一跳地址必须是直连网段,所以目标网段和下一跳一定不是同段地址。
代码如下:
static BOOLEAN GetEthernetMacAddress(char *ver)
{
FILE *mac;
char str[32] = {0};
strcpy(ver,"00:00:00:00:00:00");
mac = popen("cat /sys/class/net/eth0/address","r");
if(mac != NULL){
if(fgets(str,sizeof(str),mac) != NULL){
strcpy(ver,str);
}
pclose(mac);
return true;
}
return false;
}
ref:https://blog.csdn.net/liuxinfa/article/details/82878816
以下是adb工具包最新Google官方版下载地址:
ADB和Fastboot for Windows
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
ADB和Fastboot for Mac
https://dl.google.com/android/repository/platform-tools-latest-darwin.zip
ADB和Fastboot for Linux
https://dl.google.com/android/repository/platform-tools-latest-linux.zip
由于这些是直接的 Google 链接,用户可以确保下载不仅是官方的,而且将始终能够获得最新版本的 ADB 和 Fastboot 。