BewareMyPower commented on issue #325:
URL: 
https://github.com/apache/pulsar-client-cpp/issues/325#issuecomment-1751914150

   Here are the LLDB debug result:
   
   ```
   Process 15050 stopped
   * thread #2, stop reason = EXC_BAD_ACCESS (code=1, address=0xbeaddccd09f0)
       frame #0: 0x0000000102ccfa2c 
libpulsar.dylib`boost::asio::detail::reactor_op::reactor_op(this=0x00000001010110b0,
 success_ec=0x0000beaddccd09f0, 
perform_func=(libpulsar.dylib`boost::asio::detail::reactive_socket_send_op_base<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul> >::do_perform(boost::asio::detail::reactor_op*) at 
reactive_socket_send_op.hpp:53), 
complete_func=(libpulsar.dylib`boost::asio::detail::reactive_socket_send_op<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul>, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::asio::any_io_executor>::do_complete(void*, 
boost::asio::detail::scheduler_operation*, boost::system::error_code const&, 
unsigned long) at reactive_socket_send_op.hp
 p:124))(boost::asio::detail::reactor_op*), void (*)(void*, 
boost::asio::detail::scheduler_operation*, boost::system::error_code const&, 
unsigned long)) at reactor_op.hpp:56:7
      53          reactor_op(const boost::system::error_code& success_ec,
      54              perform_func_type perform_func, func_type complete_func)
      55            : operation(complete_func),
   -> 56              ec_(success_ec),
      57              cancellation_key_(0),
      58              bytes_transferred_(0),
      59              perform_func_(perform_func)
   Target 0: (ChunkDedupTest) stopped.
   (lldb) bt
   * thread #2, stop reason = EXC_BAD_ACCESS (code=1, address=0xbeaddccd09f0)
     * frame #0: 0x0000000102ccfa2c 
libpulsar.dylib`boost::asio::detail::reactor_op::reactor_op(this=0x00000001010110b0,
 success_ec=0x0000beaddccd09f0, 
perform_func=(libpulsar.dylib`boost::asio::detail::reactive_socket_send_op_base<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul> >::do_perform(boost::asio::detail::reactor_op*) at 
reactive_socket_send_op.hpp:53), 
complete_func=(libpulsar.dylib`boost::asio::detail::reactive_socket_send_op<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul>, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::asio::any_io_executor>::do_complete(void*, 
boost::asio::detail::scheduler_operation*, boost::system::error_code const&, 
unsigned long) at reactive_socket_send_op.hp
 p:124))(boost::asio::detail::reactor_op*), void (*)(void*, 
boost::asio::detail::scheduler_operation*, boost::system::error_code const&, 
unsigned long)) at reactor_op.hpp:56:7
       frame #1: 0x0000000102cf042c 
libpulsar.dylib`boost::asio::detail::reactive_socket_send_op_base<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul> >::reactive_socket_send_op_base(this=0x00000001010110b0, 
success_ec=0x0000beaddccd09f0, socket=29, state='\0', 
buffers=0x000000016fe864a8, flags=0, 
complete_func=(libpulsar.dylib`boost::asio::detail::reactive_socket_send_op<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul>, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::asio::any_io_executor>::do_complete(void*, 
boost::asio::detail::scheduler_operation*, boost::system::error_code const&, 
unsigned long) at reactive_socket_send_op.hpp:124))(void*, 
boost::asio::detail::scheduler_operation*, boost::s
 ystem::error_code const&, unsigned long)) at reactive_socket_send_op.hpp:43:7
       frame #2: 0x0000000102d5245c 
libpulsar.dylib`boost::asio::detail::reactive_socket_send_op<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul>, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::asio::any_io_executor>::reactive_socket_send_op(this=0x00000001010110b0, 
success_ec=0x0000beaddccd09f0, socket=29, state='\0', 
buffers=0x000000016fe864a8, flags=0, handler=0x000000016fe866f8, 
io_ex=0x00006000026009e0)::$_20> >&, boost::asio::any_io_executor const&) at 
reactive_socket_send_op.hpp:114:7
       frame #3: 0x0000000102d52058 
libpulsar.dylib`boost::asio::detail::reactive_socket_send_op<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul>, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::asio::any_io_executor>::reactive_socket_send_op(this=0x00000001010110b0, 
success_ec=0x0000beaddccd09f0, socket=29, state='\0', 
buffers=0x000000016fe864a8, flags=0, handler=0x000000016fe866f8, 
io_ex=0x00006000026009e0)::$_20> >&, boost::asio::any_io_executor const&) at 
reactive_socket_send_op.hpp:118:3
       frame #4: 0x0000000102d51e00 libpulsar.dylib`void 
boost::asio::detail::reactive_socket_service_base::async_send<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul>, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::asio::any_io_executor>(this=0x0000beaddccd09e8, impl=0x00006000026009c8, 
buffers=0x000000016fe864a8, flags=0, handler=0x000000016fe866f8, 
io_ex=0x00006000026009e0)::$_20> >&, boost::asio::any_io_executor const&) at 
reactive_socket_service_base.hpp:301:21
       frame #5: 0x0000000102d51d28 libpulsar.dylib`void 
boost::asio::basic_stream_socket<boost::asio::ip::tcp, 
boost::asio::any_io_executor>::initiate_async_send::operator(this=0x000000016fe86420,
 handler=0x000000016fe866f8, buffers=0x000000016fe864a8, 
flags=0)<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::asio::detail::prepared_buffers<boost::asio::const_buffer, 64ul> 
>(boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >&&, 
boost::asio::detail::prepared_buffers<boost::asio::const_buffer, 64ul> const
 &, int) const at basic_stream_socket.hpp:1142:34
       frame #6: 0x0000000102d51c88 libpulsar.dylib`void 
boost::asio::detail::completion_handler_async_result<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, void 
(boost::system::error_code, unsigned 
long)>::initiate<boost::asio::basic_stream_socket<boost::asio::ip::tcp, 
boost::asio::any_io_executor>::initiate_async_send, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands(initiation=0x000000016fe86420,
 token=0x000000016fe866f8, args=0x000000016fe864a8, 
args=0x000000016fe8641c)::$_20> >, boost::asio::detail::prepared_buf
 fers<boost::asio::const_buffer, 64ul> const&, 
int>(boost::asio::basic_stream_socket<boost::asio::ip::tcp, 
boost::asio::any_io_executor>::initiate_async_send&&, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >&&, 
boost::asio::detail::prepared_buffers<boost::asio::const_buffer, 64ul> const&, 
int&&) at async_result.hpp:482:5
       frame #7: 0x0000000102d51c48 
libpulsar.dylib`boost::asio::constraint<detail::async_result_has_initiate_memfn<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, void 
(boost::system::error_code, unsigned long)>::value, 
decltype(async_result<std::__1::decay<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> > >::type, 
void (boost::system::error_code, unsigned 
long)>::initiate(declval<boost::asio::basic_stream_socket<boost::asio::ip::tcp, 
boost::asio::any_io_executor>::initiate_async_send&&>(), declval<boost::a
 sio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, 
boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >&&>(), 
declval<boost::asio::detail::prepared_buffers<boost::asio::const_buffer, 64ul> 
const&>(), declval<int&&>()))>::type 
boost::asio::async_initiate<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands(initiation=0x000000016fe86420,
 token=0x000000016fe866f8, args=0x000000016fe864a8, 
args=0x000000016fe8641c)::$_20> >, void (boost::system::error_code, unsigned 
long), boost::asio::basic_stream_socket<boost::asio::ip::tcp, 
boost::asio::any_io_executor>::initiate_async_send, boost::asio
 ::detail::prepared_buffers<boost::asio::const_buffer, 64ul> const&, 
int>(boost::asio::basic_stream_socket<boost::asio::ip::tcp, 
boost::asio::any_io_executor>::initiate_async_send&&, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >&, 
boost::asio::detail::prepared_buffers<boost::asio::const_buffer, 64ul> const&, 
int&&) at async_result.hpp:895:10
       frame #8: 0x0000000102d51bf8 libpulsar.dylib`auto 
boost::asio::basic_stream_socket<boost::asio::ip::tcp, 
boost::asio::any_io_executor>::async_write_some<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul>, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands(this=0x00006000026009c0,
 buffers=0x000000016fe864a8, token=0x000000016fe866f8)::$_20> > 
>(boost::asio::detail::prepared_buffers<boost::asio::const_buffer, 64ul> 
const&, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >&&) at 
basic_stream_socket.
 hpp:970:12
       frame #9: 0x0000000102d519c8 
libpulsar.dylib`boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> 
>::operator(this=0x000000016fe866f8, ec=error_code @ 0x000000016fe865f0, 
bytes_transferred=65536, start=0)(boost::system::error_code, unsigned long, 
int) at write.hpp:345:21
       frame #10: 0x0000000102d52c1c 
libpulsar.dylib`boost::asio::detail::binder2<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::system::error_code, unsigned long>::operator(this=0x000000016fe866f8)() 
at bind_handler.hpp:289:5
       frame #11: 0x0000000102d52bd8 libpulsar.dylib`void 
boost::asio::asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::system::error_code, unsigned long> >(function=0x000000016fe866f8)::$_20> 
>, boost::system::error_code, unsigned long>&, ...) at 
handler_invoke_hook.hpp:88:3
       frame #12: 0x0000000102d52bb4 libpulsar.dylib`void 
boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::system::error_code, unsigned long>, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> 
>(function=0x000000016fe866f8, context=0x000000016fe86798)::$_20> >, 
boost::system::error_code, unsigned long>&, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20>&) at 
handler_invoke_helpers.hpp:54:3
       frame #13: 0x0000000102d52b80 libpulsar.dylib`void 
boost::asio::detail::asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::system::error_code, unsigned long>, 
boost::asio::basic_stream_socket<boost::asio::ip::tcp, 
boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> 
>(function=0x000000016fe866f8, this_handler=0x000000016fe866f8)::$_20> >, 
boost::system::error_code, unsigned long>&, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, boost::a
 sio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >*) at 
write.hpp:430:5
       frame #14: 0x0000000102d52b18 libpulsar.dylib`void 
boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::system::error_code, unsigned long>, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> > 
>(function=0x000000016fe866f8, context=0x000000016fe866f8)::$_20> >, 
boost::system::error_code, unsigned long>&, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::Compos
 iteSharedBuffer<2>, boost::asio::const_buffer const*, 
boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >&) at 
handler_invoke_helpers.hpp:54:3
       frame #15: 0x0000000102d52864 libpulsar.dylib`void 
boost::asio::detail::handler_work<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::asio::any_io_executor, 
void>::complete<boost::asio::detail::binder2<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands(this=0x000000016fe86880,
 function=0x000000016fe866f8, handler=0x000000016fe866f8)::$_20> >, 
boost::system::error_code, unsigned long> 
>(boost::asio::detail::binder2<boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::as
 io::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::system::error_code, unsigned long>&, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >&) at 
handler_work.hpp:524:7
       frame #16: 0x0000000102d525cc 
libpulsar.dylib`boost::asio::detail::reactive_socket_send_op<boost::asio::detail::prepared_buffers<boost::asio::const_buffer,
 64ul>, 
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,
 boost::asio::any_io_executor>, pulsar::CompositeSharedBuffer<2>, 
boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, 
AllocHandler<pulsar::ClientConnection::sendPendingCommands()::$_20> >, 
boost::asio::any_io_executor>::do_complete(owner=0x0000000100f05460, 
base=0x00000001010110b0, (null)=0x000000016fe86dd0, (null)=0) at 
reactive_socket_send_op.hpp:155:9
       frame #17: 0x0000000102ccdfd4 
libpulsar.dylib`boost::asio::detail::scheduler_operation::complete(this=0x00000001010110b0,
 owner=0x0000000100f05460, ec=0x000000016fe86dd0, bytes_transferred=0) at 
scheduler_operation.hpp:40:5
       frame #18: 0x0000000102cdec40 
libpulsar.dylib`boost::asio::detail::scheduler::do_run_one(this=0x0000000100f05460,
 lock=0x000000016fe869e0, this_thread=0x000000016fe86a18, 
ec=0x000000016fe86dd0) at scheduler.ipp:493:12
       frame #19: 0x0000000102cde8ec 
libpulsar.dylib`boost::asio::detail::scheduler::run(this=0x0000000100f05460, 
ec=0x000000016fe86dd0) at scheduler.ipp:210:10
       frame #20: 0x0000000102ebd804 
libpulsar.dylib`boost::asio::io_context::run(this=0x0000600003700268, 
ec=0x000000016fe86dd0) at io_context.ipp:72:16
       frame #21: 0x0000000102ebd3d4 
libpulsar.dylib`pulsar::ExecutorService::start(this=0x00006000002139e8)::$_0::operator()()
 const at ExecutorService.cc:39:25
       frame #22: 0x0000000102ebd26c 
libpulsar.dylib`decltype(__f=0x00006000002139e8)::$_0>()()) 
std::__1::__invoke[abi:v15006]<pulsar::ExecutorService::start()::$_0>(pulsar::ExecutorService::start()::$_0&&)
 at invoke.h:394:23
       frame #23: 0x0000000102ebd248 libpulsar.dylib`void 
std::__1::__thread_execute[abi:v15006]<std::__1::unique_ptr<std::__1::__thread_struct,
 std::__1::default_delete<std::__1::__thread_struct> >, 
pulsar::ExecutorService::start()::$_0>(__t=size=2, (null)=__tuple_indices<> @ 
0x000000016fe86f7f)::$_0>&, std::__1::__tuple_indices<>) at thread:290:5
       frame #24: 0x0000000102ebcecc libpulsar.dylib`void* 
std::__1::__thread_proxy[abi:v15006]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct,
 std::__1::default_delete<std::__1::__thread_struct> >, 
pulsar::ExecutorService::start()::$_0> >(__vp=0x00006000002139e0) at 
thread:301:5
       frame #25: 0x000000019c70bfa8 libsystem_pthread.dylib`_pthread_start + 
148
   ```
   
   The underlying implementation of `boost::asio::async_write(socket, ...)` is:
   1. Register a `write_op` object that wraps the buffer to `socket`. See the 
following code from `boost/asio/impl/write.hpp` of Boost 1.82.
   
   ```c++
   465   template <typename AsyncWriteStream>
   466   class initiate_async_write
   467   {
   468   public:
   481     template <typename WriteHandler, typename ConstBufferSequence,
   482         typename CompletionCondition>
   483     void operator()(BOOST_ASIO_MOVE_ARG(WriteHandler) handler,
   484         const ConstBufferSequence& buffers,
   485         BOOST_ASIO_MOVE_ARG(CompletionCondition) completion_cond) const
   486     {
   /* ... */
   493       start_write_op(stream_, buffers,  // [2], stream_ is the socket
   494           boost::asio::buffer_sequence_begin(buffers),
   495           completion_cond2.value, handler2.value);
   496     }
   ```
   
   ```c++
   542     void (boost::system::error_code, std::size_t))
   543 async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
   /* ... */
   555 {
   556   return async_initiate<WriteToken,
   557     void (boost::system::error_code, std::size_t)>(
   558       detail::initiate_async_write<AsyncWriteStream>(s),  // [1]
   559       token, buffers,
   560       BOOST_ASIO_MOVE_CAST(CompletionCondition)(completion_condition));
   561 }
   ```
   
   2. Call `socket.async_write_some` in a loop until the whole buffer is sent 
successfully. See the frame 9 in the stacks above. (So It cannot be reproduced 
with small messages because `async_write_some` could once send all bytes.)
   
   ```c++
   // frame 9, boost/asio/impl/write.hpp (Boost 1.82.0)
      342               {
      343                 {
      344                   BOOST_ASIO_HANDLER_LOCATION((__FILE__, __LINE__, 
"async_write"));
   -> 345                   stream_.async_write_some(buffers_.prepare(max_size),
      346                       BOOST_ASIO_MOVE_CAST(write_op)(*this));
      347                 }
      348                 return; default:
   ```
   
   As we can see, the application crashed at `async_write_some` after the 
`ClientConnection` object is destructed (see the `Destroyed connection to 
pulsar://127.0.0.1:6650` log before the crash) After closing the socket, the 
`write_op` will break the loop with `operation_aborted` and then trigger a 
callback in the event loop.
   
   ```c++
   // boost/asio/impl/write.hpp
   355           if (this->cancelled() != cancellation_type::none)
   356           {
   357             ec = error::operation_aborted;
   358             break;
   359           }
   ```
   
   In `ClientConnection::close`, the `ClientConnection` object will be removed 
from the pool via `pool_.remove`. Since only the `ConnectionPool` owns the 
`ClientConnection`, the `ClientConnection` object, as well as the `socket_` 
field, will be destroyed after it's removed from the pool.
   
   However, the `write_op` object is registered with the socket (`stream_` 
here) object, the next time when Asio event loop executes the callback, a 
destroyed socket address will be accessed. Before 
https://github.com/apache/pulsar-client-cpp/pull/317, the `ClientConnection` is 
owned by the callback rather than the pool. The `ClientConnection` object will 
be passed into the next callback. Only after the last callback that owns 
`ClientConnection` is completed will it be destroyed. 
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to