技
代码无情
人生苦短,我最好躺着赚钱
展开
-
protobuf的安装和使用
protobuf的安装sudo apt-get install autoconf automake libtool curl make g++ unzipgit clone https://github.com/google/protobuf.gitcd protobufgit submodule update --init --recursive./autogen.sh./configuremakemake checksudo make installsudo ldconfig原创 2021-09-10 17:20:11 · 275 阅读 · 0 评论 -
ubuntu命令行模式启动
文件:vi /etc/default/grub修改:GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”=》GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash 3”生效:sudo update-grub 重启。原创 2021-04-28 10:52:39 · 457 阅读 · 0 评论 -
gdb加载调试符号(符号表)
抽取调试符号:objcopy --only-keep-debug DEBUG版可执行文件 符号表文件名.symbol在gdb中加载符号表:gdb --symbol=符号表文件名.symbol -exec=RELEASE版可执行文件原创 2021-04-19 17:57:04 · 10859 阅读 · 0 评论 -
配置Linux自动生成core文件
编辑/etc/security/limits.conf文件,在末尾添加 soft core unlimited修改内核转储文件名格式:/proc/sys/kernel/core_pattern文件。echo -e "/root/corefile/core-%e-%s-%p-%t" > /proc/sys/kernel/core_pattern其中,%e表示进程名,%s表示进程崩溃时收到的信号,%p带白哦进程ID,%t表示时间戳...原创 2021-04-19 17:54:00 · 340 阅读 · 0 评论 -
ldconfig用法
ldconfig是设置系统的动态库路径的,设置完成后,新的shell窗口也能起作用。ldconfig是系统动态库连接管理工具,使用ldconfig的时候需要注意如下几点:如果把动态库文件复制到/usr/lib或者/lib,再赋值完成以后,需要执行一下ldconfig命令,否则不会起效果如果不复制到/usr/lib或者/lib中,而是其他自定义的路径,那么就需要把路径添加到/etc/ld.so.conf中,修改完成后需要执行ldconfig...原创 2021-04-19 17:45:45 · 6655 阅读 · 0 评论 -
g++自带内存检查工具
在编译时,加入编译选项 -fsanitize=address,再重新编译并执行程序,检查结果会在程序退出之后打印在标准输出中原创 2021-04-19 09:13:14 · 415 阅读 · 0 评论 -
gdb命令补遗
set args 参数1 参数2 -> 设置启动参数=======================================rb -> 使用正则表达式来设置断点b +5 -> 在当前行的后第5行设置断点tb -> 设置临时断点,只命中一次就删除========================================enable count 次数 断点号 -> 启用某个断点一定次数ignore 断点号 次数 -> 忽略某断点原创 2021-04-17 11:47:06 · 81 阅读 · 0 评论 -
O2优化后,程序freez了(变量的读取过程被优化,使用volatile可解决)
一、现象先上源码:#include <thread>#include <iostream>int main() { int a = 0; int flag = 0; std::thread t1([&]() { while (flag != 1); int b = a; std::cout << "b = " &l原创 2021-03-11 16:13:39 · 520 阅读 · 1 评论 -
linux查看当前CPU调度的线程
在shell上复制并粘贴服下命令while true; do cat /proc/sched_debug | grep "curr->pid"; sleep 1; done使用场景:粗略判断是哪个线程占用CPU比较频繁,配合GDB可以找到问题进程中的某个线程,缩小问题的搜索范围。缺点:只能1秒一输出,精度不够。...原创 2021-01-11 15:38:03 · 689 阅读 · 0 评论 -
DLT 网关功能配置
DLT 网关功能使用dlt的gateway功能,要先明确两个概念:gateway端和passive端。简而言之,gateway端就是开启gateway功能,能够把passive端的log传输给dlt-viewer的dlt-daemon。而passive端则是产生dlt log,并不直接与某个dlt-viewer相连的dlt-daemon。为了调查dlt的gateway功能,我建立了两个虚拟机,一个作为passive端,一个作为gateway端。再用pc作为dlt-viewer端来接收passive端原创 2020-11-17 10:35:54 · 2567 阅读 · 2 评论 -
DLT 本地log功能配置
dlt本地log需要指定APP NAME和CONTEX NAME才能保存对应的log。1、操作过程:在dlt.conf中打开本地log的配置项:然后再在OfflineLogstorageDirPath路径下创建本地log规则文件:dlt_logstorage.conf在文件中写入过滤规则:再启动dlt-daemon -c /etc/dlt.conf -d,这样就可以让dlt针对LOG 这个app中以TEST为名的ctx的log(log等级大于DLT_LOG_WARN)都保存在/opt/tes原创 2020-11-17 10:26:30 · 5554 阅读 · 0 评论 -
屏蔽gdb的回车提示
set pagination off // 不要出现 Type to continue 的提示信息原创 2020-10-27 19:45:26 · 639 阅读 · 0 评论 -
【strace挺神奇】跟踪fd的生老病死
遇到一个文件描述符耗尽的问题。不知道在哪leak的。同事告诉我用一下strace。命令:strace -fp 617 #617是进程号,也可以用strace命令起进程strace打印出的log:从上图的高亮部分可以看出,代码里用socket系统调用申请了一个fd之后,试图connect一个本地socket,但是由于server端没有上线(通信文件都没创建),导致connect失败了。失败之后,代码并没有close这个fd(如果close的话,在connect后面会打出来)。导致原创 2020-09-23 16:28:53 · 641 阅读 · 0 评论 -
C++11 按行读取文件的迭代器
定义:#include <iostream>#include <fstream>#include <string>#include <cstddef>//ptrdiff_t 需要该头文件using namespace std;class ifs_line_reader{ class iterator { typedef ptrdiff_t different_type;//定义++原创 2020-07-31 16:29:41 · 561 阅读 · 0 评论 -
C++11 打印系统时间(精确到毫秒)和时间戳(毫秒单位)
把下面这两个函数加入代码中:std::time_t getTimeStamp(){ std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); auto tmp=std::chron原创 2020-06-05 11:48:41 · 12922 阅读 · 0 评论 -
C++11打印时间问题
#include <iostream>#include <chrono>int main(){std::chrono::steady_clock::time_point t1 = std::chrono::system_clock::now();std::cout << "Hello World\n";std::chrono::steady_clock::time_point t2 = std::chrono:: system_clock::now();s原创 2020-06-04 20:31:18 · 782 阅读 · 0 评论 -
使用cmake做工程构建时,有关install的一些小技巧
cmake自带变量CMAKE_INSTALL_PREFIX不能随着subdir传递下去,必须要在最外层指定由我们自定义的变量可以随着subdir传递下去拷贝目录用如下cmake命令:INSTALL(DIRECTORY ${WORK_PATH}/auto_part_tool DESTINATION "usr/bin" DIRECTORY...原创 2020-04-16 14:50:23 · 1162 阅读 · 0 评论 -
重定向到文件时的缓冲问题
在定位一个问题的时候发现“用命令行重定向程序的输出log到一个文件”的时候,文件里没有任何打印。之前在定位同一个程序的“非预期退出”问题时明明有打印的。调查后发现这是文件缓冲带来的影响。这种问题在以前的才坑历程中遇到过,只是忘记了,现在再次回想起来,于是就记录一下。标准输出是有缓冲的(标准错误没有),缓冲分为三种:无缓冲行缓冲(遇到\n才输出到文件)全缓冲(程序退出才输出到文件)...原创 2020-04-09 09:57:44 · 986 阅读 · 0 评论 -
libevent使用
客户端代码,使用libevent+单线程.libevent,我个人理解,它就是给epoll封装了一下,搞了个时间注册的机制,说到底还是单线程。我觉得,起 数量与CPU核心数量相匹配的 线程来处理计算业务,然后把IO需求都扔个一个单独的线程去处理,这样的效率会更高。#include <stdlib.h>#include <stdio.h>#include <sy...原创 2019-07-25 02:00:19 · 174 阅读 · 0 评论 -
第三方库管理脚本(可实现把程序依赖的库一键安装到新环境上,在程序中需要指定rpath,其路径与脚本中RPATH_PREFIX要一致)
[root@localhost195-46 kernel]# cat setup_env.sh #!/bin/bashRPATH_PREFIX=/usr/smias/libINCLUDE_PREFIX=/usr/smias/include################### mySQL lib ############################MYSQL_PREFIX_PA...原创 2019-07-21 21:49:03 · 241 阅读 · 0 评论 -
epoll使用
头文件#include <sys/epoll.h>创建 int epoll_create(int size)size: 该值是给内核的一个建议,建议内核给该epfd分配size这么多节点。只是个建议,内核可以动态增大epfd中的容量。返回值: 返回的文件描述符指向一个红黑树的根节点操作文件描述符epoll_ctl(int epfd, int op,...原创 2019-07-21 22:51:26 · 137 阅读 · 0 评论 -
TCP的TIME_WAIT状态和端口复用
TCP在四次挥手时的值得关注的几个状态:主动关闭SOCK的一方会处于FIN_WAIT2状态,即主动关闭方的半连接状态。被动关闭方给主动关闭方回复了ACK之后会进入CLOSE_WAIT状态,此时被动方没有close socket主动方给被动方回复了ACK之后会进入TIME_WAIT状态,等待2MSL的时间(在linux上是1分钟左右),之后再结束TIME_WAIT状态。这样做是为了确保被动方...原创 2019-07-21 23:03:36 · 2273 阅读 · 0 评论 -
vim设置
set numbersyntax onset showmodeset showcmdset encoding=utf-8set t_Co=256filetype indent onset autoindentset tabstop=2set shiftwidth=4set expandtabset softtabstop=4#设置行号为相对行号set relativenu...原创 2019-07-30 22:15:39 · 190 阅读 · 1 评论 -
socket编程ipv6版本
服务端(server.c)#include <stdlib.h>#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <string.h>#include <ctype.h...原创 2019-07-22 10:20:41 · 1026 阅读 · 0 评论 -
C语言宏杂技
使用宏杂技,心里一定要默念:“这是代码级的字符串替换”。换言之,宏只是替换进代码里去,就像直接写进去一样,替换完再参与编译。1.#转换符。#var 表示取var的变量名(即 “var”),而不是取它的值。例子(打印变量名和变量值)://#var表示变量名#define debug_value(var) printf("%s:%d, ", #var, var)使用:#include ...原创 2019-08-02 11:25:12 · 156 阅读 · 0 评论 -
sscanf高级用法
理解了%[^|]|这个模式就基本能解析复杂字符串了。这个模式是%s的一个正则表达式方向的进化,本意也是要取字符串,但是是有选择的取。如何选择,就写在[]中。其中的^表示“不取”,不取哪些模式就写在^的后面。例子中的[^\]就表示不取|,取到|就停止了,最后一个|则对应源串中的|。整体来看,%[^|]|就表示取到|为止(不取这个|)然后跳过|。另外还有更多的取%s的进化,比如%[0-9](只...原创 2019-08-09 09:36:08 · 353 阅读 · 0 评论 -
创建守护进程
守护进程的特点:常驻内存会话组组长进程组组长无控制终端#include <unistd.h>#include <iostream>#include <fstream>#include <fcntl.h>std::ofstream fs;void handler(int sig) //信号处理函数参数为int ,返回值为vo...原创 2019-07-29 21:21:29 · 116 阅读 · 0 评论