如何调试DPDK库来诊断分段错误?
How to debug DPDK libraries to diagnose segmentation fault?
我正在 Linux 上使用稳定版 DPDK 18.11.8,使用 gcc x64 构建。
在运行时出现分段错误。 运行 核心转储上的 gdb 给出了这个回溯:
#0 0x0000000000f65680 in rte_eth_devices ()
#1 0x000000000048a03a in rte_eth_rx_burst (nb_pkts=7,
rx_pkts=0x7fab40620480, queue_id=0, port_id=<optimized out>)
at
/opt/dpdk/dpdk-18.08/x86_64-native-linuxapp-gcc/include/rte_ethdev.h:3825
#2 Socket_poll (ucRxPortId=<optimized out>, ucRxQueId=ucRxQueId at entry=0
'[=10=]0', uiMaxNumOfRxFrm=uiMaxNumOfRxFrm at entry=7,
pISocketListener=pISocketListener at entry=0xf635d0 <FH_gtFrontHaulObj+16>)
at /data/<snip>/SocketClass.c:2188
#3 0x000000000048b941 in FH_perform (args_ptr=<optimized out>) at
/data/<snip>/FrontHaul.c:281
#4 0x00000000005788e4 in eal_thread_loop ()
#5 0x00007fab419fae65 in start_thread () from /lib64/libpthread.so.0
#6 0x00007fab4172388d in clone () from /lib64/libc.so.6
所以似乎 rte_eth_rx_burst() 调用了 rte_eth_devices () 并且那个函数崩溃了,大概是因为非法内存访问。可能是大页面问题?
我想在 DPDK 中启用更多调试信息。我正在使用以下方法构建 DPDK:
usertools/dpdk-setup.sh
我认为该脚本中的构建命令使用 make 是否正确,我应该修改适当的:
config/defconfig_*
文件(在我的例子中是defconfig_x86_64-native-linuxapp-gcc)?
如果是这样,这些值是否合适?
CONFIG_RTE_LIBRTE_ETHDEV_DEBUG=y
RTE_LOG_LEVEL=RTE_LOG_DEBUG
RTE_LIBRTE_ETHDEV_DEBUG=y
(不确定是否所有值都应以 'CONFIG_' 为前缀?)
我尝试使用以下方法构建 DPDK:
$ export EXTRA_CFLAGS='-O0 -g'
$ make install T=x86_64-native-linuxapp-gcc
但这在回溯中没有提供额外信息。
编辑:发现错误更新为 Fixed and running without crashing now
使用聊天室 dpdk-debug,我们能够使用适当的 CFLAGS 重建库和应用程序。使用 gdb 已经确定可能的原因是 rte_eth_rx_burst 没有通过 mbuf 的指针数组传递。
根据框架 1
的 GDB 详细信息,应用程序似乎不是使用 EXTRA_CFLAGS
构建的(假设您使用的是 DPDK 示例 Makefile)。构建用于调试的 DPDK 应用程序的正确方法是按照
中的步骤操作
- cd [dpdk目标文件夹]
- 清洁
- 制作EXTRA_CFLAGS='-O0 -ggdb'
- cd [应用文件夹]
- 制作EXTRA_CFLAGS='-O0 -ggdb'
然后在TUI或非TUI模式下使用GDB分析错误。
注意:
- 我在 rx_burst 中犯的最常见错误之一是传递 *mbuf_array 而不是 **mbuf_array 作为参数。
- 如果自定义 Makefile 用于应用程序,请将 EXTRA_CFLAGS 作为
CFLAGS+="-O0 -ggdb"
传递
我正在 Linux 上使用稳定版 DPDK 18.11.8,使用 gcc x64 构建。
在运行时出现分段错误。 运行 核心转储上的 gdb 给出了这个回溯:
#0 0x0000000000f65680 in rte_eth_devices ()
#1 0x000000000048a03a in rte_eth_rx_burst (nb_pkts=7,
rx_pkts=0x7fab40620480, queue_id=0, port_id=<optimized out>)
at
/opt/dpdk/dpdk-18.08/x86_64-native-linuxapp-gcc/include/rte_ethdev.h:3825
#2 Socket_poll (ucRxPortId=<optimized out>, ucRxQueId=ucRxQueId at entry=0
'[=10=]0', uiMaxNumOfRxFrm=uiMaxNumOfRxFrm at entry=7,
pISocketListener=pISocketListener at entry=0xf635d0 <FH_gtFrontHaulObj+16>)
at /data/<snip>/SocketClass.c:2188
#3 0x000000000048b941 in FH_perform (args_ptr=<optimized out>) at
/data/<snip>/FrontHaul.c:281
#4 0x00000000005788e4 in eal_thread_loop ()
#5 0x00007fab419fae65 in start_thread () from /lib64/libpthread.so.0
#6 0x00007fab4172388d in clone () from /lib64/libc.so.6
所以似乎 rte_eth_rx_burst() 调用了 rte_eth_devices () 并且那个函数崩溃了,大概是因为非法内存访问。可能是大页面问题?
我想在 DPDK 中启用更多调试信息。我正在使用以下方法构建 DPDK:
usertools/dpdk-setup.sh
我认为该脚本中的构建命令使用 make 是否正确,我应该修改适当的:
config/defconfig_*
文件(在我的例子中是defconfig_x86_64-native-linuxapp-gcc)?
如果是这样,这些值是否合适?
CONFIG_RTE_LIBRTE_ETHDEV_DEBUG=y
RTE_LOG_LEVEL=RTE_LOG_DEBUG
RTE_LIBRTE_ETHDEV_DEBUG=y
(不确定是否所有值都应以 'CONFIG_' 为前缀?)
我尝试使用以下方法构建 DPDK:
$ export EXTRA_CFLAGS='-O0 -g'
$ make install T=x86_64-native-linuxapp-gcc
但这在回溯中没有提供额外信息。
编辑:发现错误更新为 Fixed and running without crashing now
使用聊天室 dpdk-debug,我们能够使用适当的 CFLAGS 重建库和应用程序。使用 gdb 已经确定可能的原因是 rte_eth_rx_burst 没有通过 mbuf 的指针数组传递。
根据框架 1
的 GDB 详细信息,应用程序似乎不是使用 EXTRA_CFLAGS
构建的(假设您使用的是 DPDK 示例 Makefile)。构建用于调试的 DPDK 应用程序的正确方法是按照
- cd [dpdk目标文件夹]
- 清洁
- 制作EXTRA_CFLAGS='-O0 -ggdb'
- cd [应用文件夹]
- 制作EXTRA_CFLAGS='-O0 -ggdb'
然后在TUI或非TUI模式下使用GDB分析错误。
注意:
- 我在 rx_burst 中犯的最常见错误之一是传递 *mbuf_array 而不是 **mbuf_array 作为参数。
- 如果自定义 Makefile 用于应用程序,请将 EXTRA_CFLAGS 作为
CFLAGS+="-O0 -ggdb"
传递