c
xingyeping
这个作者很懒,什么都没留下…
展开
-
64位机器一次变长参数打印内存访问错误的定位
64位机器一次变长参数打印内存访问错误的定位在维护路由代码时,修改了一份调试函数在shell中打印,发现打印后引发进程访问错误的内存。所有宏用数字代替,为错误的代码如下所示: snprintf(buf, 512, "[%#x]%c%c%s [%d/%lu] ", rib->flags, CHECK_FLAG (rib->flags, FLAG_SELECTED) ?原创 2016-10-31 14:25:37 · 844 阅读 · 1 评论 -
malloc失败导致线程死锁
malloc失败导致线程死锁环境:Linux3.44 / libc.so.6 2.17 错误栈信息:Thread 1 (Thread 0x7fcae15e9740 (LWP 17012)):#0 0x00007fcadededbd8 in pthread_once () from /lib64/libpthread.so.0#1 0x00007fcadeb2a08c in backtra原创 2016-11-26 11:07:09 · 3659 阅读 · 0 评论 -
Linux环境定位C程序内存泄露以及非法访问的方法
网上有很多例子,这里主要依照工作中的使用来记录一下心得。通过搜索可以搜到mcheck、mtrace、valgrind等等各种方法。这里记录一下:mcheck 具体可以搜《Linux系统下借助mcheck实现c/c++程序的堆内存异常检查》这篇文章,比较详细。我比较喜欢用其中的b、c两种:b. 在makefile中使用-lmcheck来链接程序。优点:无需在源码中显式调用mcheck,且一定可以原创 2017-06-01 10:21:43 · 2322 阅读 · 0 评论 -
Linux编译出的进程内没有新编写的函数
今日一位同事在代码里新增了一个.c文件,加了几个调试函数,运行后发现无法使用。通过objdump反汇编看到汇编代码里确实没有该c文件中的调试函数。一开始以为编译有问题,经排查,发现.o确实生成,并且和其他.o生成的.a中也能反汇编出这些函数,在编译输出中也能看到链接.a的信息。 后来发现,应该是没有调用过此.c中的函数,导致链接优化掉了这些函数。经网上搜索,有如下可用信息: 不把未调用的函数l原创 2017-07-26 10:09:05 · 396 阅读 · 0 评论 -
编译VPP报错
这两天想研究下VPP,下了代码,按照网上的步骤进行编译:make install-dep; make bootstrap; makebuild; 发现如下错误:vpp/build-data/../src/vpp/api/api_format.c:1:1: error: expected identifier or ‘(’ before ‘.’ token ../../vat/api_fo原创 2017-11-14 19:11:18 · 1738 阅读 · 2 评论 -
路由管理性能优化之路
去年的时候,测试1W条路由的收敛性能,大概需要5s以上,这个成绩比较差,当时分析了一下,认为是路由管理模块不支持路由更新的操作导致的,这样会浪费1倍的消息处理。今年这个问题又重新提起,由于这次有着比较明确的优化目标,因此不再像去年那样纯粹的看代码猜测。 首先,使用perf + 火焰图查看了本进程的热点函数,关掉了一些浪费性能的日志,优化了一些热点,并提供了路由更新的 发...原创 2018-05-16 14:43:20 · 695 阅读 · 0 评论 -
OSPF SPF计算的避让算法
OSPF在计算SPF时,为了防止震荡以及连续收到LSA时多次计算SPF,某些代码里实现了避让算法。代码如下:#define OSPF_SPF_INCREMENT_VALUE 2#define ONE_SEC_MICROSECOND 1000000void ospf_spf_calculate_timer_add (struct ospf_area *area){ struc...原创 2018-06-01 09:42:36 · 1329 阅读 · 0 评论