rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);断言失败

Open Hotwill opened this issue 9 years ago • 17 comments

只要启用lwip,终端就会不断打印出: pbuf_free: p->ref > 0 Assertion: 650 in ....\components\net\lwip-head\src\core\pbuf.c, thread tcpip 最终定位到pbuf.c中的LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);断言失败导致的。 这应该是一个已经释放的pbuf被再次释放引起的。请修复这一问题。

Hotwill avatar Oct 14 '15 01:10 Hotwill

请使用lwip-1.4.1的版本,这个是默认的lwIP版本。

BernardXiong avatar Oct 14 '15 02:10 BernardXiong

默认的不就是lwip-1.4.1的吗?我使用的就是这个版本

Hotwill avatar Oct 14 '15 02:10 Hotwill

Assertion: 650 in ....\components\net\lwip-head\src\core\pbuf.c, thread tcpip

你的log信息出卖了你。

BernardXiong avatar Oct 14 '15 03:10 BernardXiong

lwip-head是支持IPv4/v6双栈的lwip,这个是在1.4.1的基础上开发的,我要用到ipv6,所以必须用这个。

Hotwill avatar Oct 14 '15 08:10 Hotwill

IPv4/v6双栈的lwIP都还未正式发布呢

BernardXiong avatar Oct 14 '15 14:10 BernardXiong

我从github上下载了最新的rt-thread,什么都没有修改,也没有启用ipv6。只写了一个简单的服务端测试程序。在传输的时候还是会出现这样的问题: finsh>>Get connection from 192.168.0.101 Recv 1024! Recv 1024! Recv 436! Recv 588! Recv 1024! Recv 436! Recv 588! Recv 1024! Recv 436! Recv 1024! Recv 436! Recv 1024! Recv 436! Recv 915! Recv 1024! Recv 436! Recv 1024! Recv 436! Recv 1024! Recv 1024! Recv 890! Recv 1024! Recv 436!pbuf_free: p->ref > 0 Assertion: 650 in ../../components/net/lwip-1.4.1/src/core/pbuf.c, thread tcpip (0) assertion failed at function:sys_arch_assert, line number:591

下面是我的主要代码: void tcp_server_thread_entry(void *parameter) { int port = 3001; int sockfd, clientfd, bytes_received; struct sockaddr_in my_addr, their_addr; socklen_t sin_size; char buf[1024];

sockfd = socket(AF_INET, SOCK_STREAM, 0);

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = INADDR_ANY;
rt_memset(&my_addr.sin_zero, 0, 8);

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1)
{
    rt_kprintf("Bind local port %d failed!\n", port);
    return;
}

if (listen(sockfd, 5) == -1)
{
    rt_kprintf("Listen failed!\n");
    return;
}

while (1)
{
    clientfd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
    rt_kprintf("Get connection from %s\n", inet_ntoa(their_addr.sin_addr));

    while (1)
    {
        bytes_received = recv(clientfd, buf, sizeof(buf), 0);
        if (bytes_received <= 0)
        {
            rt_kprintf("Disconnect with client!\n");
            closesocket(clientfd);
            break;
        }

        rt_kprintf("Recv %d!\n", bytes_received);
    }
}

}

Hotwill avatar Oct 15 '15 10:10 Hotwill

Hi, 当前这个问题是什么状态?如果是 lwip_head,是否可以使用最新的lwip版本试试?

BernardXiong avatar Nov 17 '15 11:11 BernardXiong

遇到同样的问题,同样时LWIP 1.4.1 finsh>>a connection close try accept Got a connection from (192.168.1.101, 2388) pbuf_free: p->ref > 0 Assertion: 650 in /home/xxxxxxxx/rtthread/components/net/lwip-1.4.1/src/core/pbuf.c, thread tcpip (0) assertion failed at function:sys_arch_assert, line number:592 请问解决方法了吗?

imlvye avatar Apr 14 '16 10:04 imlvye

还没有解决

Hotwill avatar Apr 18 '16 11:04 Hotwill

这个问题有什么进展吗?我这的程序在更换网卡驱动后出现了这个断言。

cmheia avatar Sep 12 '17 12:09 cmheia

I"m getting the same poblem.

tranthudo avatar Nov 23 '18 09:11 tranthudo

the same problem at 4.0.2

SunJun8 avatar Dec 24 '19 07:12 SunJun8

https://www.cnblogs.com/woshixiaojingzai/p/13958572.html 我认为这篇文章有些参考价值,各位可以分析看看,是否能解决,或者有没有更好的方法

tamerxu avatar Oct 16 '21 08:10 tamerxu

有进展吗

LMRD-Mars avatar Feb 04 '22 08:02 LMRD-Mars

我们这边的一般的 eth 驱动里,pbuf 一般都是 pbuf pool 的形式。 pbuf pool 数量也是在 lwipopt.h 中指定的内存池大小。 重复释放问题确实可能存在,但是可能是工程里的对 pbuf 的处理时具体的使用方法有关。

这个问题的复现,我这边还没有必现的工程,能否提供一下?

xiangxistu avatar Mar 25 '22 10:03 xiangxistu

@xiangxistu 用st的话大部分应该是直接在eth用的sram上直接构造pbuf,容易出现同一块内存被使用两次

SunJun8 avatar Mar 26 '22 08:03 SunJun8

这种问题一般是多线程导致的,可以加上互斥锁试试是否还会复现,然后再考虑是否有更精细的处理办法

childerxxx avatar Nov 28 '22 14:11 childerxxx