我有一个DPDK环境设置,程序的buggy部分连接一个字符串。该字符串可以是只要它得到(假设一个1,000,000最大字符)。我用./program =‘0-4’运行我的程序
我使用的是DPDK的rte_malloc、rte_memcpy、rte_strlcat和rte_free函数。下面是代码的一个片段
int current_length = strlen(fx->var);
int new_length = (datalen + current_length) + 1;
char *temp = (char *)rte_malloc("char *", new_length * (*fx->var), 0);
rte_memcpy(temp, fx->var, current_length);
rte_strlcat(temp, data, datalen);
temp[new_length] = '\0';
fx->var = (char *)rte_malloc("var", new_length * (*fx->var), 0);
rte_memcpy(fx->var, temp, new_length);
fx->var[new_length] = '\0';
rte_free(temp);
我的程序在使用EAL: eal_memalloc_alloc_seg_bulk():无法找到合适的memseg_list之后退出。下面是我得到的堆栈跟踪
(gdb) where
#0 0x0000555555564d5b in _mm256_storeu_si256 (__A=..., __P=0x0) at /usr/lib/gcc/x86_64-linux-gnu/9/include/avxintrin.h:928
#1 rte_mov32 (
src=0x1a80b5a80 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", dst=0x0) at /usr/local/include/rte_memcpy.h:320
#2 rte_mov64 (
src=0x1a80b5a80 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", dst=0x0) at /usr/local/include/rte_memcpy.h:330
#3 rte_memcpy_aligned (n=88, src=0x1a80b5a80, dst=0x0) at /usr/local/include/rte_memcpy.h:856
#4 rte_memcpy (n=88, src=0x1a80b5a80, dst=0x0) at /usr/local/include/rte_memcpy.h:872
#5 parse_something (flow=0x7ff7c83c8288, id=60806,
data=0x7ff82cd77cc5 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", datalen=89, flags=4) at main.c:1187
#6 0x000055555557c2e1 in process_something (result=0x7fffed7fad88) at main.c:2147
#7 0x000055555557c467 in some_flow (worker=0x7fffed7fad70, result=0x7fffed7fad88) at main.c:2199
#8 0x000055555557e5e0 in some_loop (arg=0x5555556262f0) at main.c:2273
我需要一个想法的错误在这里,我是不是错过了一些EAL配置。在此之前,我正在研究文档,并试图从DPDK程序员指南(EAL、Mbuf、Mempool库中具体理解)中了解。
机器规格
20.11.0-rc1
f 219
如果我在上面的细节中遗漏了什么,请告诉我
发布于 2021-04-12 09:36:36
正如在评论中指出的,乘法必须给出一个数值。否则,将使用fx->var
的ASCII值。因此,共享注释中的建议,将atoi(fx->var)
用于数字字符串到int值。
注意:通过修改代码片段,我能够启动并运行它,因此在rte_malloc中没有问题。
修改后的守则:
#include <rte_eal.h>
#include <rte_memcpy.h>
#include <rte_string_fns.h>
#include <rte_malloc.h>
char *mystring = "test my string: ";
char *data = "My Data.. ";
int datalen = 10;
int main(int argc, char **argv)
{
if (0 == rte_eal_init(argc, argv))
rte_exit(EXIT_FAILURE, "failed to init!");
int current_length = strlen(mystring);
int new_length = (datalen + current_length) + 1;
//char *temp = (char *)rte_malloc("char *", new_length * (*mystring), 0);
char *temp = (char *)rte_malloc("char *", new_length, 0);
if (temp == NULL)
rte_exit(EXIT_FAILURE, "temp is null!");
rte_strlcat(temp, mystring, current_length);
rte_strlcat(temp + current_length - 1, data, datalen);
temp[new_length] = '\0';
mystring = (char *)rte_malloc("var", new_length * (*mystring), 0);
if (mystring == NULL)
rte_exit(EXIT_FAILURE, "mystring is null!");
rte_memcpy(mystring, temp, new_length);
mystring[new_length] = '\0';
printf("(%s)!\n\n", mystring);
rte_free(temp);
printf("Done!");
构建命令:gcc /tmp/t.c $(pkg-config --cflags --libs --static libdpdk) -g
执行命令:sudo ./a.out --no-pci
使用Abid Zaidi
建议的测试字符串更新的编辑-1
结果:(测试我的字符串:我的数据)!
https://stackoverflow.com/questions/67038388
复制相似问题