摘要

intel dpdk 的makefile 写的很好,该好好学习他的这种架构,但在调试程序时候发现,它的编译选项优化级别很高;怎样去修改intel dpdk中的编译选项,达到自己一个一个满意的程度;其大部分makefile规则都定义在dpdk/mk目录下;最后再说一下怎样用gdb工具调试dpdk;

# ls mk/
arch      rte.app.mk     rte.extshared.mk     rte.hostlib.mk  rte.obj.mk         rte.sdkdoc.mk      rte.sdktestall.mk  rte.vars.mk
exec-env  rte.extapp.mk  rte.extvars.mk       rte.install.mk  rte.sdkbuild.mk    rte.sdkgcov.mk     rte.sdktest.mk     target
internal  rte.extlib.mk  rte.gnuconfigure.mk  rte.lib.mk      rte.sdkconfig.mk   rte.sdkinstall.mk  rte.shared.mk      toolchain
machine   rte.extobj.mk  rte.hostapp.mk       rte.module.mk   rte.sdkdepdirs.mk  rte.sdkroot.mk     rte.subdir.mk

常见问题及解决方法

1、报错:defined but not used

为了测试程序,肯定会有一些变量临时注释掉,或者有些变量定义了,但没有赋值,有些函数定义了,但不去调用;可是dpdk在编译的时候,只要有错误警告就会编译退出;

解决方法:

vim mk/toolchain/gcc/rte.vars.mk

打开mk/toolchain/gcc/rte.vars.mk文件,其中有这几行

WERROR_FLAGS := -W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
WERROR_FLAGS += -Wmissing-declarations -Wold-style-definition -Wpointer-arith
WERROR_FLAGS += -Wcast-align -Wnested-externs -Wcast-qual
WERROR_FLAGS += -Wformat-nonliteral -Wformat-security

第一行中的-Werror 选项就是指在gcc编译的时候,有任何错误就停止编译,直接退出,将这个选项去掉就可以只报警告,除非真有错误退出了;

2、dpdk编译优化选项设置

以dpdk/examples/l2fwd/Makefile文件为例

# binary name
APP = l2fwd# all source are stored in SRCS-y
SRCS-y := main.cCFLAGS += -O3
CFLAGS += $(WERROR_FLAGS)

l2fwd 是指编译出来的可执行程序名称;

main.c 是l2fwd程序的源码;

-O3 是只gcc的编译优化选项,如果不想优化基本这么高,可以将其改为 -O0、-O1 、-O2 等等 ;

CFLAGS += $(WERROR_FLAGS) 如果把这一行去的,就是去掉所有的编译警告选项,易可以达到在1部分写的去除编译警告退出的目的,但这就有点过了,有点警告才能知道自己的程序哪有问题;

3、dpdk 添加调试选项方便调试程序

有时候我们想用gdb调试我们的程序,应该怎样添加编译选项呢

1)设置环境变量

export RTE_SDK=`pwd`
export RTE_TARGET=x86_64-default-linuxapp-gcc
export EXTRA_CFLAGS="-O0 -g"

在dpdk目录,设置一下上面的环境变量,其实主要是为了设置makefile用到的编译选项EXTRA_CFLAGS 将其优化级别设置为 -O0 , 还有gdb的调试选项 -g;

2)然后编译

make -C x86_64-default-linuxapp-gcc/
make -C examples/l2fwd/

我测试的是l2fwd这个实例程序,其他实例程序编译大同小异;

3)用gdb运行测试程序

执行 gdb examples/l2fwd/build/l2fwd 运行测试程序;

# gdb examples/l2fwd/build/l2fwd
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-50.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/linzhao/repo/dpdk_project/dpdk/examples/l2fwd/build/l2fwd...done.
(gdb)

你可能会想,在执行程序的时候不是要输入程序的所需要的参数吗,不用急,在运行的时候在输入参数就行;

在gdb中执行 l 这个命令,就是list 的第一字母执行显示,看一下程序;在哪儿打断点比较好;

(gdb) l
593
594             /* init EAL */
595             ret = rte_eal_init(argc, argv);
596             if (ret < 0)
597                     rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n");
598             argc -= ret;
599             argv += ret;
600
601             /* parse application arguments (after the EAL ones) */
602             ret = l2fwd_parse_args(argc, argv);

我试着在 595行和602行大断点,分别在运行时进入这两个子函数,rte_eal_init是dpdk的库函数;l2fwd_parse_args是l2fwd 程序的私有函数;

用b ,break的第一字母打断点;

(gdb) b 595
Breakpoint 1 at 0x40f420: file /home/linzhao/repo/dpdk_project/dpdk/examples/l2fwd/main.c, line 595.
(gdb) b 602
Breakpoint 2 at 0x40f461: file /home/linzhao/repo/dpdk_project/dpdk/examples/l2fwd/main.c, line 602.

运行程序,在gdb中执行运行命令 r ,就是run的第一个字母;

注意我传入的参数, -c 1f 是指定5个core, -n4 是四通道, -p 3 是用两个端口;

(gdb) r -c 1f -n 4 -- -p 3
Starting program: /home/linzhao/repo/dpdk_project/dpdk/examples/l2fwd/build/l2fwd -c 1f -n 4 -- -p 3
[Thread debugging using libthread_db enabled]Breakpoint 1, main (argc=8, argv=0x7fffffffe248) at /home/linzhao/repo/dpdk_project/dpdk/examples/l2fwd/main.c:595
595             ret = rte_eal_init(argc, argv);
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.47.el6.x86_64

现在程序运行到了我第一个断点595行处,

然后执行单步运行命令s ,也是step的缩写;看是否能进入rte_eal_init程序运行;

(gdb) s
rte_eal_init (argc=8, argv=0x7fffffffe248) at /home/linzhao/repo/dpdk_project/dpdk/lib/librte_eal/linuxapp/eal/eal.c:809
809             struct shared_driver *solib = NULL;
(gdb) s
811             if (!rte_atomic32_test_and_set(&run_once))
(gdb) s
rte_atomic32_test_and_set (v=0x6c0c40) at /home/linzhao/repo/dpdk_project/dpdk/x86_64-default-linuxapp-gcc/include/arch/rte_atomic.h:641
641             return rte_atomic32_cmpset((volatile uint32_t *)&v->cnt, 0, 1);

从跟踪的信息看到,我们已经进入了dpdk/lib/librte_eal/linuxapp/eal/eal.c文件中,进行代码调试工作;

原文链接:https://blog.csdn.net/linzhaolover/article/details/9794285

DPDK之makefile编译选项修改和gdb调试(三)相关推荐

  1. 【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变

    上一篇文章我们学习了如何使用GDB进行软件断点调试和硬件断点调试:[软件开发底层知识修炼]十五 快速学习GDB调试二 使用GDB进行断点调试 本篇文章继续上一篇文章的学习,如何使用GDB的数据断点监测 ...

  2. Linux之IFS间隔符、C编程、Makefile工程文件、gdb调试、宏定义、预处理、assert和调试用特殊的宏

    1 间隔符 在shell下的for循环语句中,容器中,各个元素之间 是通过 间隔符 来分开的 默认情况下:读取 列表中的值----以 空格.TAB.换行  为间隔符 列表可以为:     常量    ...

  3. 【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录

    本文记录之前写过的5篇关于GDB快速学习的文章,从第一篇开始学习到最后一篇,保证可以从入门GDB调试到熟练掌握GDB调试的技巧. 学习交流加 个人qq: 1126137994 个人微信: liu112 ...

  4. 【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看

    上一篇文章学习了如何使用GDB数据断点进行内存监测:[软件开发底层知识修炼]十五 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变 本篇文章继续上一篇文章的学习:如何使用GDB进行函数调用栈 ...

  5. gdb 调试_一文入门Linux下gdb调试(二)

    点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dum ...

  6. linux gdb网络调试,一文入门Linux下gdb调试(二)

    本文转载自[微信公众号:羽林君,ID:Conscience_Remains] 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快 ...

  7. Linux下的gdb调试makefile的编写

    1.gdb调试 gdb就是用于调试可执行文件,要想让程序在调试的时候有提示信息在生成文件时加上-g (1)启动gdb:gdb +包含调试信息的应用程序 (2)l(只能查询包含在可执行程序里边的.c文件 ...

  8. Linux命令【三】gcc编译+静态库+动态库+makefile+gdb调试

    用C编译器编译源文件:gcc 源文件 -o 可执行文件名 详细步骤: gcc -E a.c -o a.i预处理器将头文件展开,宏替换,去掉注释 gcc -S a.i -o a.s编译器将C文件变成汇编 ...

  9. gcc编译以及Makefile与GDB调试

    一:编译选项:       gcc常用编译的选项: -c 表示编译源文件,只编译并生成目标文件. -E 只运行 C 预编译器. -o 表示输出目标文件 -g 表示在目标文件中产生调试信息, 用于 gd ...

最新文章

  1. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理
  2. 量子计算机真随机数,量子真随机数发生器研究取得进展
  3. 是什么浪费了我的时间
  4. python编程工资-2019年Python就业薪资怎么样?看完你就了解了
  5. 在Vivado中,使用锁定增量编译技术进行增量综合布局布线
  6. php7协程通信使用,PHP7下的协程实现
  7. 清晰版 构建最高可用oracle数据库系统.pdf,构建最高可用Oracle数据库系统
  8. 去中心化的 RTC 通信平台架构设计
  9. 阿里P8架构师谈:开源搜索引擎Lucene、Solr、Sphinx等优劣势比较
  10. 应变界的翘楚:硅基谐振式传感器灵敏度非常高
  11. docker运行dubbo-admin
  12. GAN网络的详细内容
  13. 华为耗资100亿元的研发基地着火了?
  14. 计算机教室布置图cad,CAD制作平面图教程制作教室
  15. MATLAB Win10分辨率低的蜜汁改进方法
  16. 参数篡改(Parameter Tampering)
  17. 三天打鱼两天晒网问题
  18. Excel单元格首位数字为“0”不显示的问题
  19. RemiLore:少女与异世界与魔导书 简体中文免安装版
  20. spotify电脑下载歌曲_Spotify开源Klio, 音频处理从业者的福音来了

热门文章

  1. 案例驱动python编程入门-Python程序设计任务驱动式学习教程
  2. python统计文件中的中文字数-Python实现统计文本文件字数的方法
  3. python爬虫代码房-小白学习python爬虫,分享一下代码,伪链家全站。
  4. 【剑指offer】题目二
  5. Spring-Boot项目部署到单独tomcat运行
  6. 老板问:多长时间搞定?开发说3天,測试说2天,然后……
  7. 201521123092《java程序设计》第九周学习总结
  8. 微信jssdk,实现多图上传的一点心得
  9. session的常用方法。
  10. 1040. Longest Symmetric String (25)