achild 发表于 2022-3-25 21:06:45

stm32调试软件诡异现象,debug在bkpt停下了。

最近在调试stm32h7的lwip协议栈中用socket写一个tcp服务器端。
本来是通了的,为了防阻塞接收发送卡死,给connect加timeout的时候发现,只要写了设置timeout语句lwip_setsockopt,就会在debug的时候在执行到accept的时候自动停在bkpt汇编指令处。
此时还没有运行到lwip_setsockopt。真的好诡异。求大佬解惑啊!
tcp任务如下。

void Start_Tcp_Connect_Task(void *argument)
{
/* USER CODE BEGIN Start_Tcp_Connect_Task */
/* Infinite loop */
       
        //netconn_set_nonblocking(conn,1);
        while(!eth_ok_flag)
        {
                osDelay(1);
        }               
        struct sockaddr_in server_addr;                                //服务器地址
        struct sockaddr_in conn_addr;                                //连接地址
        int sock_fd;                                                                //服务器的 socked
        int sock_conn;                                                                // 请求的 socked
        socklen_t addr_len;                                                        // 地址长度
        int err;
        int length;
        int send_timeout=5000;
        int recv_timeout=5000;
       
        sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);                //建立一个新的socket连接       
        memset(&server_addr, 0, sizeof(server_addr));                                //将服务器地址清空
        server_addr.sin_family = AF_INET;                                                        //地址家族
        server_addr.sin_addr.s_addr =htonl(INADDR_ANY);                                //注意转化为网络字节序
        server_addr.sin_port = htons(6000);       
        err = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));        //建立绑定
        if (err < 0)                                                                                                                          //如果绑定失败则关闭套接字
        {
                        closesocket(sock_fd);                                                                                                 //关闭套接字
        }
        err = listen(sock_fd, 1);                                                                        //监听连接请求
        if (err < 0)                                                                                                 //如果监听失败则关闭套接字
        {
                        closesocket(sock_fd);                                                                 //关闭套接字
        }
        addr_len = sizeof(struct sockaddr_in);                                        //将链接地址赋值给addr_len
        sock_conn = accept(sock_fd, (struct sockaddr *)&conn_addr, &addr_len);       
        send(sock_conn, "connect success!\n\r", 21, 0);
for(;;)
{       
                if(sock_conn<0)                                                                                        //状态小于0代表连接故障,此时关闭套接字
                {
                        closesocket(sock_fd);
                }
                else
                {
                        lwip_setsockopt(sock_conn,SOL_SOCKET,SO_SNDTIMEO,&send_timeout,sizeof(send_timeout));                       
                        lwip_setsockopt(sock_conn,SOL_SOCKET,SO_RCVTIMEO,&recv_timeout,sizeof(recv_timeout));                               
                        memset(data_buffer, 0, sizeof(data_buffer));                        //清空接收Buff
                        length = recv(sock_conn, (unsigned int *)data_buffer, 100, 0);       
                        if(length>0)
                        {
                                for(uint8_t i=0;i<length;i++)
                                {
                                        tcp_server_recvbuf=data_buffer;
                                }
                                send(sock_conn,data_buffer,length, 0);       
                        }
                        else
                        {
                                closesocket(sock_conn);
                        }
                }
                osDelay(1);
}
/* USER CODE END Start_Tcp_Connect_Task */
}

lb0857 发表于 2022-3-26 09:14:44

这里方法用过没有

achild 发表于 2022-3-26 10:52:35

lb0857 发表于 2022-3-26 09:14
这里方法用过没有
(引用自2楼)

第三种方法试了,没起作用。剩下两种还没试过。
看起来好像不是程序使用流程上的问题,像是协议栈使用了printf等函数,而keil又没有相关的支持导致的。
这么说好像也不是程序本身的问题。更像是编译设置的问题

achild 发表于 2022-3-28 11:06:55

achild 发表于 2022-3-26 10:52
第三种方法试了,没起作用。剩下两种还没试过。
看起来好像不是程序使用流程上的问题,像是协议栈使用了p ...
(引用自3楼)

试了一下,应该是协议栈在输出错误信息,而我这没有输出的接口。加了输出接口,但是其实更重要的是当协议栈需要输出错误信息的时候,说明此时程序已经出问题了。最重要的应该是解决这个出错的问题。

achild 发表于 2022-3-28 11:56:25

找到原因了lwip_setsockopt中参数的数据类型写错了。然后编译竟然没报错。哈哈哈

lb0857 发表于 2022-3-28 13:55:39

lwip_setsockopt中参数的数据类型错了
警告有没有?
都没有的话超出编译器检查范畴或者是逻辑性错误{:lol:}

achild 发表于 2022-3-28 14:07:12

lb0857 发表于 2022-3-28 13:55
lwip_setsockopt中参数的数据类型错了
警告有没有?
都没有的话超出编译器检查范畴或者是逻辑性错误   ...
(引用自6楼)

这个的话,仔细看了一下,应该是我的问题,传递参数一个是数据指针,一个是数据长度。数据类型错的话,也确实不会引起报错。
不过。总算是摸清楚这个协议栈的套路了。收工

achild 发表于 2022-3-31 14:56:53

本帖最后由 achild 于 2022-3-31 15:07 编辑

在记录一种情况,总是在tcp收发数据的时候跳bkpt,感觉糟透了。仔细想了下,估计跟mpu有关,对比了原子的手册,试了加了句cache透写,然后好像是不调bkpt了。
页: [1]
查看完整版本: stm32调试软件诡异现象,debug在bkpt停下了。