<div dir="ltr"><div dir="ltr"><br></div><div dir="ltr"><br></div><div>Hi Folks,</div><div>Looking to see if such a core is seen earlier in bgpd due to thread being NULL.</div><div>Similar core is also seen in zebra.</div><div><br></div><div><br></div>warning: Could not load shared library symbols for 3 libraries, e.g. /lib/libnetsnmp.so.35.<br>Use the "info sharedlibrary" command to see the complete listing.<br>Do you need "set solib-search-path" or "set sysroot"?<br>[Thread debugging using libthread_db enabled]<br>Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".<br>--Type <RET> for more, q to quit, c to continue without paging--<br>Core was generated by `/usr/lib/frr/bgpd -d -A 127.0.0.1 -M snmp'.<br>Program terminated with signal SIGABRT, Aborted.<br>#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50<br>50  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.<br>[Current thread is 1 (Thread 0xffffb9352450 (LWP 634))]<br>(gdb) up<br>#1  0x0000ffffb8dd2a28 in __GI_abort () at abort.c:79<br>79   abort.c: No such file or directory.<br>(gdb) bt<br>#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50<br>#1  0x0000ffffb8dd2a28 in __GI_abort () at abort.c:79<br>#2  0x0000ffffb9287494 in core_handler (signo=11, siginfo=0xffffdf24b1b0, context=0xffffdf24b230) at lib/sigevent.c:228<br>#3  <signal handler called><br>#4  0x0000ffffb929c9b0 in do_thread_cancel (master=0xaaaaf9433ff0) at lib/thread.c:1184<br>#5  0x0000ffffb929cc10 in thread_cancel (thread=0xaaaaf98a4230) at lib/thread.c:1234<br>#6  0x0000ffffb87eca64 in agentx_events_update () at lib/agentx.c:124<br>#7  0x0000ffffb87ec5bc in agentx_timeout (t=0xffffdf24c848) at lib/agentx.c:51<br>#8  0x0000ffffb929ded0 in thread_call (thread=0xffffdf24c848) at lib/thread.c:1762<br>#9  0x0000ffffb924ff24 in frr_run (master=0xaaaaf9433ff0) at lib/libfrr.c:1054<br>#10 0x0000aaaad4723ed8 in main (argc=6, argv=0xffffdf24cae8) at bgpd/bgp_main.c:488<br>(gdb) fr 6<br>#6  0x0000ffffb87eca64 in agentx_events_update () at lib/agentx.c:124<br>124   lib/agentx.c: No such file or directory.<br>(gdb) p ln<br>$1 = (struct listnode *) 0xaaaaf997dc40<br>(gdb) p *ln<br><div>$2 = {next = 0x0, prev = 0xaaaaf997d920, data = 0xaaaaf98a4230}</div><div><br></div><div><br></div><div><br></div><div>lib/thread.c:</div><div>/**<br> * Process cancellation requests.<br> *<br> * This may only be run from the pthread which owns the thread_master.<br> *<br> * @param master the thread master to process<br> * @REQUIRE master->mtx<br> */<br>static void do_thread_cancel(struct thread_master *master)<br>{<br>        struct thread_list_head *list = NULL;<br>        struct thread **thread_array = NULL;<br>        struct thread *thread;<br><br>        struct cancel_req *cr;<br>        struct listnode *ln;<br>        for (ALL_LIST_ELEMENTS_RO(master->cancel_req, ln, cr)) {<br>                /* If this is an event object cancellation, linear search<br>                 * through event<br>                 * list deleting any events which have the specified argument.<br>                 * We also<br>                 * need to check every thread in the ready queue. */<br>                if (cr->eventobj) {<br>                        struct thread *t;<br><br>                        frr_each_safe(thread_list, &master->event, t) {<br>                                if (t->arg != cr->eventobj)<br>                                        continue;<br>                                thread_list_del(&master->event, t);<br>                                if (t->ref)<br>                                        *t->ref = NULL;<br>                                thread_add_unuse(master, t);<br>                        }<br><br>                        frr_each_safe(thread_list, &master->ready, t) {<br>                                if (t->arg != cr->eventobj)<br>                                        continue;<br>                                thread_list_del(&master->ready, t);<br>                                if (t->ref)<br>                                        *t->ref = NULL;<br>                                thread_add_unuse(master, t);<br>                        }<br>                        continue;<br>                }<br><br>                /* The pointer varies depending on whether the cancellation<br>                 * request was<br>                 * made asynchronously or not. If it was, we need to check<br>                 * whether the<br>                 * thread even exists anymore before cancelling it. */<br>                thread = (cr->thread) ? cr->thread : *cr->threadref;<br><br>                if (!thread)<br>                        continue;<br><br>                /* Determine the appropriate queue to cancel the thread from */<br>                switch (thread->type) {<br>                case THREAD_READ:<br>                        thread_cancel_rw(master, thread->u.fd, POLLIN);<br>                        thread_array = master->read;<br>                        break;<br>                case THREAD_WRITE:<br>                        thread_cancel_rw(master, thread->u.fd, POLLOUT);<br>                        thread_array = master->write;<br>                        break;<br>                case THREAD_TIMER:<br>                        thread_timer_list_del(&master->timer, thread);<br>                        break;<br>                case THREAD_EVENT:<br>                        list = &master->event;<br>                        break;<br>                case THREAD_READY:<br>                        list = &master->ready;<br>                        break;<br>                default:<br>                        continue;<br>                        break;<br>                }<br><br>                if (list) {<br>                        thread_list_del(list, thread);<br>                } else if (thread_array) {<br>                        thread_array[thread->u.fd] = NULL;<br>                }<br><br>                if (thread->ref)<br>                        *thread->ref = NULL;<br><br>                thread_add_unuse(thread->master, thread); <=====Line 1184 where the core generated(thread is NULL here)<br>        }<br><br>        /* Delete and free all cancellation requests */<br>        list_delete_all_node(master->cancel_req);<br><br>        /* Wake up any threads which may be blocked in thread_cancel_async() */<br>        master->canceled = true;<br>        pthread_cond_broadcast(&master->cancel_cond);<br>}</div><div>Thanks</div><div>Thippanna<br></div></div>