You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2023/06/07 07:31:43 UTC

[plc4x] branch develop updated: fix(plc4go): always supply stack when recovering

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 78ae3b6430 fix(plc4go): always supply stack when recovering
78ae3b6430 is described below

commit 78ae3b6430d329b2db02b5226f251e6e68db7049
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Jun 7 09:31:35 2023 +0200

    fix(plc4go): always supply stack when recovering
---
 plc4go/internal/ads/Browser.go                            |  3 ++-
 plc4go/internal/ads/Connection.go                         |  5 +++--
 plc4go/internal/ads/Discoverer.go                         |  3 ++-
 plc4go/internal/ads/Interactions.go                       | 13 +++++++------
 plc4go/internal/ads/Reader.go                             |  5 +++--
 plc4go/internal/ads/Subscriber.go                         |  5 +++--
 plc4go/internal/ads/Writer.go                             |  5 +++--
 plc4go/internal/bacnetip/Connection.go                    |  5 +++--
 plc4go/internal/cbus/Browser.go                           |  3 ++-
 plc4go/internal/cbus/Connection.go                        |  7 ++++---
 plc4go/internal/cbus/Discoverer.go                        |  7 ++++---
 plc4go/internal/cbus/Reader.go                            |  3 ++-
 plc4go/internal/cbus/Subscriber.go                        |  3 ++-
 plc4go/internal/cbus/Writer.go                            |  3 ++-
 plc4go/internal/eip/Connection.go                         |  5 +++--
 plc4go/internal/eip/Reader.go                             |  3 ++-
 plc4go/internal/eip/Writer.go                             |  3 ++-
 plc4go/internal/knxnetip/Connection.go                    |  9 +++++----
 .../knxnetip/ConnectionDriverSpecificOperations.go        | 15 ++++++++-------
 plc4go/internal/knxnetip/ConnectionHelper.go              |  3 ++-
 plc4go/internal/knxnetip/Discoverer.go                    |  5 +++--
 plc4go/internal/knxnetip/Reader.go                        |  3 ++-
 plc4go/internal/knxnetip/Subscriber.go                    |  3 ++-
 plc4go/internal/modbus/Connection.go                      |  3 ++-
 plc4go/internal/modbus/ModbusAsciiDriver.go               |  3 ++-
 plc4go/internal/modbus/ModbusRtuDriver.go                 |  3 ++-
 plc4go/internal/modbus/ModbusTcpDriver.go                 |  3 ++-
 plc4go/internal/modbus/Reader.go                          |  3 ++-
 plc4go/internal/s7/Connection.go                          |  3 ++-
 plc4go/internal/s7/Reader.go                              |  3 ++-
 plc4go/internal/s7/Writer.go                              |  3 ++-
 plc4go/internal/simulated/Connection.go                   |  7 ++++---
 plc4go/internal/simulated/Reader.go                       |  3 ++-
 plc4go/internal/simulated/Writer.go                       |  3 ++-
 plc4go/spi/default/DefaultBrowser.go                      |  3 ++-
 plc4go/spi/default/DefaultCodec.go                        |  2 +-
 plc4go/spi/default/DefaultConnection.go                   |  5 +++--
 plc4go/spi/model/DefaultPlcReadRequest.go                 |  3 ++-
 plc4go/spi/model/DefaultPlcWriteRequest.go                |  3 ++-
 plc4go/spi/pool/WorkerPool.go                             |  8 ++++----
 plc4go/spi/transports/pcap/Transport.go                   |  3 ++-
 .../transports/utils/DefaultBufferedTransportInstance.go  |  3 ++-
 plc4go/spi/utils/Net.go                                   |  5 +++--
 43 files changed, 116 insertions(+), 75 deletions(-)

diff --git a/plc4go/internal/ads/Browser.go b/plc4go/internal/ads/Browser.go
index 19c65d2cd0..4a0590d2ba 100644
--- a/plc4go/internal/ads/Browser.go
+++ b/plc4go/internal/ads/Browser.go
@@ -22,6 +22,7 @@ package ads
 import (
 	"context"
 	"github.com/pkg/errors"
+	"runtime/debug"
 	"strings"
 
 	"github.com/apache/plc4x/plc4go/internal/ads/model"
@@ -45,7 +46,7 @@ func (m *Connection) BrowseWithInterceptor(ctx context.Context, browseRequest ap
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcBrowseRequestResult(browseRequest, nil, errors.Errorf("Recovered from panic: %v", err))
+				result <- spiModel.NewDefaultPlcBrowseRequestResult(browseRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		responseCodes := map[string]apiModel.PlcResponseCode{}
diff --git a/plc4go/internal/ads/Connection.go b/plc4go/internal/ads/Connection.go
index 1b6d034a86..f48364f943 100644
--- a/plc4go/internal/ads/Connection.go
+++ b/plc4go/internal/ads/Connection.go
@@ -26,6 +26,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"strconv"
 	"strings"
 
@@ -113,7 +114,7 @@ func (m *Connection) ConnectWithContext(ctx context.Context) <-chan plc4go.PlcCo
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- _default.NewDefaultPlcConnectionCloseResult(nil, errors.Errorf("Recovered from panic: %v", err))
+				ch <- _default.NewDefaultPlcConnectionCloseResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		err := m.messageCodec.Connect()
@@ -170,7 +171,7 @@ func (m *Connection) setupConnection(ctx context.Context, ch chan plc4go.PlcConn
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed: %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		for message := range defaultIncomingMessageChannel {
diff --git a/plc4go/internal/ads/Discoverer.go b/plc4go/internal/ads/Discoverer.go
index 89fb53e01e..8204904fbe 100644
--- a/plc4go/internal/ads/Discoverer.go
+++ b/plc4go/internal/ads/Discoverer.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 	"net"
 	"net/url"
+	"runtime/debug"
 	"strconv"
 	"time"
 
@@ -145,7 +146,7 @@ func (d *Discoverer) Discover(ctx context.Context, callback func(event apiModel.
 		go func(discoveryItem *discovery) {
 			defer func() {
 				if err := recover(); err != nil {
-					d.log.Error().Msgf("panic-ed %v", err)
+					d.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 				}
 			}()
 			buf := make([]byte, 1024)
diff --git a/plc4go/internal/ads/Interactions.go b/plc4go/internal/ads/Interactions.go
index b6d5ecc9ad..3e4fa2f88e 100644
--- a/plc4go/internal/ads/Interactions.go
+++ b/plc4go/internal/ads/Interactions.go
@@ -22,6 +22,7 @@ package ads
 import (
 	"context"
 	"fmt"
+	"runtime/debug"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/protocols/ads/readwrite/model"
@@ -33,7 +34,7 @@ func (m *Connection) ExecuteAdsReadDeviceInfoRequest(ctx context.Context) (model
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		request := m.NewAdsReadDeviceInfoRequest()
@@ -74,7 +75,7 @@ func (m *Connection) ExecuteAdsReadRequest(ctx context.Context, indexGroup uint3
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		request := m.NewAdsReadRequest(indexGroup, indexOffset, length)
@@ -115,7 +116,7 @@ func (m *Connection) ExecuteAdsWriteRequest(ctx context.Context, indexGroup uint
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		request := m.NewAdsWriteRequest(indexGroup, indexOffset, data)
@@ -156,7 +157,7 @@ func (m *Connection) ExecuteAdsReadWriteRequest(ctx context.Context, indexGroup
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		request := m.NewAdsReadWriteRequest(indexGroup, indexOffset, readLength, items, writeData)
@@ -197,7 +198,7 @@ func (m *Connection) ExecuteAdsAddDeviceNotificationRequest(ctx context.Context,
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		request := m.NewAdsAddDeviceNotificationRequest(indexGroup, indexOffset, length, transmissionMode, maxDelay, cycleTime)
@@ -238,7 +239,7 @@ func (m *Connection) ExecuteAdsDeleteDeviceNotificationRequest(ctx context.Conte
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		request := m.NewAdsDeleteDeviceNotificationRequest(notificationHandle)
diff --git a/plc4go/internal/ads/Reader.go b/plc4go/internal/ads/Reader.go
index b0b4255a4e..899595600a 100644
--- a/plc4go/internal/ads/Reader.go
+++ b/plc4go/internal/ads/Reader.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"encoding/binary"
 	"fmt"
+	"runtime/debug"
 	"strings"
 
 	"github.com/apache/plc4x/plc4go/internal/ads/model"
@@ -46,7 +47,7 @@ func (m *Connection) Read(ctx context.Context, readRequest apiModel.PlcReadReque
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		if len(readRequest.GetTagNames()) <= 1 {
@@ -97,7 +98,7 @@ func (m *Connection) singleRead(ctx context.Context, readRequest apiModel.PlcRea
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		response, err := m.ExecuteAdsReadRequest(ctx, directAdsTag.IndexGroup, directAdsTag.IndexOffset, directAdsTag.DataType.GetSize())
diff --git a/plc4go/internal/ads/Subscriber.go b/plc4go/internal/ads/Subscriber.go
index 5442b57184..232ce42816 100644
--- a/plc4go/internal/ads/Subscriber.go
+++ b/plc4go/internal/ads/Subscriber.go
@@ -22,6 +22,7 @@ package ads
 import (
 	"context"
 	"github.com/apache/plc4x/plc4go/spi/options"
+	"runtime/debug"
 	"time"
 
 	dirverModel "github.com/apache/plc4x/plc4go/internal/ads/model"
@@ -99,7 +100,7 @@ func (m *Connection) Subscribe(ctx context.Context, subscriptionRequest apiModel
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		// Iterate over all sub-results
@@ -128,7 +129,7 @@ func (m *Connection) subscribe(ctx context.Context, subscriptionRequest apiModel
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				responseChan <- spiModel.NewDefaultPlcSubscriptionRequestResult(subscriptionRequest, nil, errors.Errorf("panic-ed %v", err))
+				responseChan <- spiModel.NewDefaultPlcSubscriptionRequestResult(subscriptionRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		// At this point we are sure to only have single item direct tag requests.
diff --git a/plc4go/internal/ads/Writer.go b/plc4go/internal/ads/Writer.go
index 95ad6e5131..1629546797 100644
--- a/plc4go/internal/ads/Writer.go
+++ b/plc4go/internal/ads/Writer.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"encoding/binary"
 	"fmt"
+	"runtime/debug"
 	"strings"
 
 	"github.com/apache/plc4x/plc4go/internal/ads/model"
@@ -45,7 +46,7 @@ func (m *Connection) Write(ctx context.Context, writeRequest apiModel.PlcWriteRe
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		if len(writeRequest.GetTagNames()) <= 1 {
@@ -106,7 +107,7 @@ func (m *Connection) singleWrite(ctx context.Context, writeRequest apiModel.PlcW
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		response, err := m.ExecuteAdsWriteRequest(ctx, directAdsTag.IndexGroup, directAdsTag.IndexOffset, data)
diff --git a/plc4go/internal/bacnetip/Connection.go b/plc4go/internal/bacnetip/Connection.go
index 6bb7a865e0..049a5c9bb4 100644
--- a/plc4go/internal/bacnetip/Connection.go
+++ b/plc4go/internal/bacnetip/Connection.go
@@ -28,6 +28,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/utils"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"sync"
 	"time"
 
@@ -89,14 +90,14 @@ func (c *Connection) ConnectWithContext(ctx context.Context) <-chan plc4go.PlcCo
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v", err))
+				ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		connectionConnectResult := <-c.DefaultConnection.ConnectWithContext(ctx)
 		go func() {
 			defer func() {
 				if err := recover(); err != nil {
-					ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v", err))
+					ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 				}
 			}()
 			for c.IsConnected() {
diff --git a/plc4go/internal/cbus/Browser.go b/plc4go/internal/cbus/Browser.go
index 3ae33a08c7..89d8f29350 100644
--- a/plc4go/internal/cbus/Browser.go
+++ b/plc4go/internal/cbus/Browser.go
@@ -22,6 +22,7 @@ package cbus
 import (
 	"context"
 	"fmt"
+	"runtime/debug"
 	"time"
 
 	plc4go "github.com/apache/plc4x/plc4go/pkg/api"
@@ -273,7 +274,7 @@ func (m Browser) getInstalledUnitAddressBytes(ctx context.Context) (map[byte]any
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack:\n%s", err, debug.Stack())
 			}
 		}()
 		defer readCtxCancel()
diff --git a/plc4go/internal/cbus/Connection.go b/plc4go/internal/cbus/Connection.go
index 88e574a986..9d65646a7a 100644
--- a/plc4go/internal/cbus/Connection.go
+++ b/plc4go/internal/cbus/Connection.go
@@ -26,6 +26,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"sync"
 	"time"
 
@@ -123,7 +124,7 @@ func (c *Connection) ConnectWithContext(ctx context.Context) <-chan plc4go.PlcCo
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				c.fireConnectionError(errors.Errorf("panic-ed %v", err), ch)
+				c.fireConnectionError(errors.Errorf("panic-ed %v. Stack:\n%s", err, debug.Stack()), ch)
 			}
 		}()
 		if err := c.messageCodec.Connect(); err != nil {
@@ -228,7 +229,7 @@ func (c *Connection) startSubscriptionHandler() {
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				c.log.Error().Msgf("panic-ed %v", err)
+				c.log.Error().Msgf("panic-ed %v. Stack:\n%s", err, debug.Stack())
 			}
 		}()
 		c.log.Debug().Msg("SAL handler stated")
@@ -248,7 +249,7 @@ func (c *Connection) startSubscriptionHandler() {
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				c.log.Error().Msgf("panic-ed %v", err)
+				c.log.Error().Msgf("panic-ed %v. Stack:\n%s", err, debug.Stack())
 			}
 		}()
 		c.log.Debug().Msg("default MMI started")
diff --git a/plc4go/internal/cbus/Discoverer.go b/plc4go/internal/cbus/Discoverer.go
index c6495aaa7f..6e06869113 100644
--- a/plc4go/internal/cbus/Discoverer.go
+++ b/plc4go/internal/cbus/Discoverer.go
@@ -28,6 +28,7 @@ import (
 	"github.com/rs/zerolog"
 	"net"
 	"net/url"
+	"runtime/debug"
 	"sync"
 	"sync/atomic"
 	"time"
@@ -90,7 +91,7 @@ func (d *Discoverer) Discover(ctx context.Context, callback func(event apiModel.
 		go func(netInterface addressProvider, interfaceLog zerolog.Logger) {
 			defer func() {
 				if err := recover(); err != nil {
-					interfaceLog.Error().Msgf("panic-ed %v", err)
+					interfaceLog.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 				}
 			}()
 			defer func() { wg.Done() }()
@@ -124,7 +125,7 @@ func (d *Discoverer) Discover(ctx context.Context, callback func(event apiModel.
 				go func(addressLogger zerolog.Logger) {
 					defer func() {
 						if err := recover(); err != nil {
-							addressLogger.Error().Msgf("panic-ed %v", err)
+							addressLogger.Error().Msgf("panic-ed %v. Stack: %s; ", err, debug.Stack())
 						}
 					}()
 					defer func() { wg.Done() }()
@@ -157,7 +158,7 @@ func (d *Discoverer) Discover(ctx context.Context, callback func(event apiModel.
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				d.log.Error().Msgf("panic-ed %v", err)
+				d.log.Error().Msgf("panic-ed %v. Stack: %s; ", err, debug.Stack())
 			}
 		}()
 		for transportInstance := range transportInstances {
diff --git a/plc4go/internal/cbus/Reader.go b/plc4go/internal/cbus/Reader.go
index e57f344224..f44fbadf41 100644
--- a/plc4go/internal/cbus/Reader.go
+++ b/plc4go/internal/cbus/Reader.go
@@ -25,6 +25,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
 	"github.com/rs/zerolog/log"
+	"runtime/debug"
 	"sync"
 	"time"
 
@@ -64,7 +65,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 func (m *Reader) readSync(ctx context.Context, readRequest apiModel.PlcReadRequest, result chan apiModel.PlcReadRequestResult) {
 	defer func() {
 		if err := recover(); err != nil {
-			result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v", err))
+			result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 		}
 	}()
 	numTags := len(readRequest.GetTagNames())
diff --git a/plc4go/internal/cbus/Subscriber.go b/plc4go/internal/cbus/Subscriber.go
index 45f3f4318d..e0fef87a17 100644
--- a/plc4go/internal/cbus/Subscriber.go
+++ b/plc4go/internal/cbus/Subscriber.go
@@ -25,6 +25,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"strings"
 	"time"
 
@@ -56,7 +57,7 @@ func (m *Subscriber) Subscribe(_ context.Context, subscriptionRequest apiModel.P
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcSubscriptionRequestResult(subscriptionRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcSubscriptionRequestResult(subscriptionRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		internalPlcSubscriptionRequest := subscriptionRequest.(*spiModel.DefaultPlcSubscriptionRequest)
diff --git a/plc4go/internal/cbus/Writer.go b/plc4go/internal/cbus/Writer.go
index 8dbaf855fe..43fc194634 100644
--- a/plc4go/internal/cbus/Writer.go
+++ b/plc4go/internal/cbus/Writer.go
@@ -24,6 +24,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"sync"
 	"time"
 
@@ -58,7 +59,7 @@ func (m *Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteReques
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		numTags := len(writeRequest.GetTagNames())
diff --git a/plc4go/internal/eip/Connection.go b/plc4go/internal/eip/Connection.go
index b6beeb6005..9ef70ea2cd 100644
--- a/plc4go/internal/eip/Connection.go
+++ b/plc4go/internal/eip/Connection.go
@@ -26,6 +26,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/pkg/api"
@@ -125,7 +126,7 @@ func (m *Connection) ConnectWithContext(ctx context.Context) <-chan plc4go.PlcCo
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v", err))
+				ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		err := m.messageCodec.Connect()
@@ -156,7 +157,7 @@ func (m *Connection) Close() <-chan plc4go.PlcConnectionCloseResult {
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- _default.NewDefaultPlcConnectionCloseResult(nil, errors.Errorf("panic-ed %v", err))
+				result <- _default.NewDefaultPlcConnectionCloseResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		m.log.Debug().Msg("Sending UnregisterSession EIP Packet")
diff --git a/plc4go/internal/eip/Reader.go b/plc4go/internal/eip/Reader.go
index f0ebcf1cd8..81459228a4 100644
--- a/plc4go/internal/eip/Reader.go
+++ b/plc4go/internal/eip/Reader.go
@@ -27,6 +27,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
 	"regexp"
+	"runtime/debug"
 	"strconv"
 	"time"
 
@@ -68,7 +69,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		classSegment := readWriteModel.NewLogicalSegment(readWriteModel.NewClassID(0, 6))
diff --git a/plc4go/internal/eip/Writer.go b/plc4go/internal/eip/Writer.go
index 6ebb162028..7700df8c60 100644
--- a/plc4go/internal/eip/Writer.go
+++ b/plc4go/internal/eip/Writer.go
@@ -25,6 +25,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"strings"
 
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -64,7 +65,7 @@ func (m Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteRequest
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		items := make([]readWriteModel.CipService, len(writeRequest.GetTagNames()))
diff --git a/plc4go/internal/knxnetip/Connection.go b/plc4go/internal/knxnetip/Connection.go
index 887e9548da..26f5ae8ba8 100644
--- a/plc4go/internal/knxnetip/Connection.go
+++ b/plc4go/internal/knxnetip/Connection.go
@@ -27,6 +27,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"strconv"
 	"strings"
 	"sync"
@@ -233,7 +234,7 @@ func (m *Connection) ConnectWithContext(ctx context.Context) <-chan plc4go.PlcCo
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v", err))
+				result <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		// Open the UDP Connection
@@ -305,7 +306,7 @@ func (m *Connection) ConnectWithContext(ctx context.Context) <-chan plc4go.PlcCo
 				go func() {
 					defer func() {
 						if err := recover(); err != nil {
-							m.log.Error().Msgf("panic-ed %v", err)
+							m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 						}
 					}()
 					defaultIncomingMessageChannel := m.messageCodec.GetDefaultIncomingMessageChannel()
@@ -405,7 +406,7 @@ func (m *Connection) Close() <-chan plc4go.PlcConnectionCloseResult {
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v", err))
+				result <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		// Stop the connection-state checker.
@@ -468,7 +469,7 @@ func (m *Connection) Ping() <-chan plc4go.PlcConnectionPingResult {
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- _default.NewDefaultPlcConnectionPingResult(errors.Errorf("panic-ed %v", err))
+				result <- _default.NewDefaultPlcConnectionPingResult(errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		// Send the connection state request
diff --git a/plc4go/internal/knxnetip/ConnectionDriverSpecificOperations.go b/plc4go/internal/knxnetip/ConnectionDriverSpecificOperations.go
index 44173c8334..53d4cc37a2 100644
--- a/plc4go/internal/knxnetip/ConnectionDriverSpecificOperations.go
+++ b/plc4go/internal/knxnetip/ConnectionDriverSpecificOperations.go
@@ -22,6 +22,7 @@ package knxnetip
 import (
 	"context"
 	"math"
+	"runtime/debug"
 	"strconv"
 	"time"
 
@@ -65,7 +66,7 @@ func (m *Connection) ReadGroupAddress(ctx context.Context, groupAddress []byte,
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		groupAddressReadResponse, err := m.sendGroupAddressReadRequest(ctx, groupAddress)
@@ -125,7 +126,7 @@ func (m *Connection) DeviceConnect(ctx context.Context, targetAddress driverMode
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		// If we're already connected, use that connection instead.
@@ -220,7 +221,7 @@ func (m *Connection) DeviceDisconnect(ctx context.Context, targetAddress driverM
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		if connection, ok := m.DeviceConnections[targetAddress]; ok {
@@ -258,7 +259,7 @@ func (m *Connection) DeviceAuthenticate(ctx context.Context, targetAddress drive
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		// Check if there is already a connection available,
@@ -318,7 +319,7 @@ func (m *Connection) DeviceReadProperty(ctx context.Context, targetAddress drive
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		// Check if there is already a connection available,
@@ -402,7 +403,7 @@ func (m *Connection) DeviceReadPropertyDescriptor(ctx context.Context, targetAdd
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		// Check if there is already a connection available,
@@ -467,7 +468,7 @@ func (m *Connection) DeviceReadMemory(ctx context.Context, targetAddress driverM
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		// Set a default datatype, if none is specified
diff --git a/plc4go/internal/knxnetip/ConnectionHelper.go b/plc4go/internal/knxnetip/ConnectionHelper.go
index d68cdd5626..be8e2bfd6a 100644
--- a/plc4go/internal/knxnetip/ConnectionHelper.go
+++ b/plc4go/internal/knxnetip/ConnectionHelper.go
@@ -24,6 +24,7 @@ import (
 	"fmt"
 	"math"
 	"net"
+	"runtime/debug"
 	"strconv"
 	"sync/atomic"
 	"time"
@@ -54,7 +55,7 @@ func (m *Connection) handleIncomingTunnelingRequest(ctx context.Context, tunneli
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		lDataInd, ok := tunnelingRequest.GetCemi().(driverModel.LDataIndExactly)
diff --git a/plc4go/internal/knxnetip/Discoverer.go b/plc4go/internal/knxnetip/Discoverer.go
index 092b4fb3b2..c4fd9310be 100644
--- a/plc4go/internal/knxnetip/Discoverer.go
+++ b/plc4go/internal/knxnetip/Discoverer.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 	"net"
 	"net/url"
+	"runtime/debug"
 	"sync"
 	"sync/atomic"
 	"time"
@@ -104,7 +105,7 @@ func (d *Discoverer) Discover(ctx context.Context, callback func(event apiModel.
 		go func(netInterface net.Interface) {
 			defer func() {
 				if err := recover(); err != nil {
-					d.log.Error().Msgf("panic-ed %v", err)
+					d.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 				}
 			}()
 			defer func() { wg.Done() }()
@@ -142,7 +143,7 @@ func (d *Discoverer) Discover(ctx context.Context, callback func(event apiModel.
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				d.log.Error().Msgf("panic-ed %v", err)
+				d.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		for transportInstance := range transportInstances {
diff --git a/plc4go/internal/knxnetip/Reader.go b/plc4go/internal/knxnetip/Reader.go
index 4d4d2f7e60..452edbe380 100644
--- a/plc4go/internal/knxnetip/Reader.go
+++ b/plc4go/internal/knxnetip/Reader.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"strconv"
 	"strings"
 	"time"
@@ -56,7 +57,7 @@ func (m Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest) <
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				resultChan <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v", err))
+				resultChan <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		responseCodes := map[string]apiModel.PlcResponseCode{}
diff --git a/plc4go/internal/knxnetip/Subscriber.go b/plc4go/internal/knxnetip/Subscriber.go
index 3c6f8b0a4f..e541455d89 100644
--- a/plc4go/internal/knxnetip/Subscriber.go
+++ b/plc4go/internal/knxnetip/Subscriber.go
@@ -24,6 +24,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"time"
 
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -55,7 +56,7 @@ func (m *Subscriber) Subscribe(ctx context.Context, subscriptionRequest apiModel
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcSubscriptionRequestResult(subscriptionRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcSubscriptionRequestResult(subscriptionRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		internalPlcSubscriptionRequest := subscriptionRequest.(*spiModel.DefaultPlcSubscriptionRequest)
diff --git a/plc4go/internal/modbus/Connection.go b/plc4go/internal/modbus/Connection.go
index 854a29af8f..f6e1236913 100644
--- a/plc4go/internal/modbus/Connection.go
+++ b/plc4go/internal/modbus/Connection.go
@@ -25,6 +25,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/pkg/api"
@@ -106,7 +107,7 @@ func (m *Connection) Ping() <-chan plc4go.PlcConnectionPingResult {
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- _default.NewDefaultPlcConnectionPingResult(errors.Errorf("panic-ed %v", err))
+				result <- _default.NewDefaultPlcConnectionPingResult(errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		diagnosticRequestPdu := readWriteModel.NewModbusPDUDiagnosticRequest(0, 0x42)
diff --git a/plc4go/internal/modbus/ModbusAsciiDriver.go b/plc4go/internal/modbus/ModbusAsciiDriver.go
index becf7180cb..783f1327ac 100644
--- a/plc4go/internal/modbus/ModbusAsciiDriver.go
+++ b/plc4go/internal/modbus/ModbusAsciiDriver.go
@@ -30,6 +30,7 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 	"net/url"
+	"runtime/debug"
 	"strconv"
 )
 
@@ -74,7 +75,7 @@ func (m ModbusAsciiDriver) GetConnectionWithContext(ctx context.Context, transpo
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		for {
diff --git a/plc4go/internal/modbus/ModbusRtuDriver.go b/plc4go/internal/modbus/ModbusRtuDriver.go
index 710c4c3a4a..62120ca44f 100644
--- a/plc4go/internal/modbus/ModbusRtuDriver.go
+++ b/plc4go/internal/modbus/ModbusRtuDriver.go
@@ -30,6 +30,7 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 	"net/url"
+	"runtime/debug"
 	"strconv"
 )
 
@@ -74,7 +75,7 @@ func (m ModbusRtuDriver) GetConnectionWithContext(ctx context.Context, transport
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		for {
diff --git a/plc4go/internal/modbus/ModbusTcpDriver.go b/plc4go/internal/modbus/ModbusTcpDriver.go
index da5e0494f2..7267bdede8 100644
--- a/plc4go/internal/modbus/ModbusTcpDriver.go
+++ b/plc4go/internal/modbus/ModbusTcpDriver.go
@@ -30,6 +30,7 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 	"net/url"
+	"runtime/debug"
 	"strconv"
 )
 
@@ -74,7 +75,7 @@ func (m ModbusTcpDriver) GetConnectionWithContext(ctx context.Context, transport
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		for {
diff --git a/plc4go/internal/modbus/Reader.go b/plc4go/internal/modbus/Reader.go
index 29d2689dc1..6f37d5ef12 100644
--- a/plc4go/internal/modbus/Reader.go
+++ b/plc4go/internal/modbus/Reader.go
@@ -24,6 +24,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/rs/zerolog"
 	"math"
+	"runtime/debug"
 	"sync/atomic"
 	"time"
 
@@ -60,7 +61,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		if len(readRequest.GetTagNames()) != 1 {
diff --git a/plc4go/internal/s7/Connection.go b/plc4go/internal/s7/Connection.go
index 867f44b6a9..40933db93d 100644
--- a/plc4go/internal/s7/Connection.go
+++ b/plc4go/internal/s7/Connection.go
@@ -27,6 +27,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
 	"reflect"
+	"runtime/debug"
 	"strings"
 	"sync"
 
@@ -118,7 +119,7 @@ func (m *Connection) ConnectWithContext(ctx context.Context) <-chan plc4go.PlcCo
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v", err))
+				ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		err := m.messageCodec.Connect()
diff --git a/plc4go/internal/s7/Reader.go b/plc4go/internal/s7/Reader.go
index 59ea75bc28..967808b7d2 100644
--- a/plc4go/internal/s7/Reader.go
+++ b/plc4go/internal/s7/Reader.go
@@ -24,6 +24,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"time"
 
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -60,7 +61,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 
diff --git a/plc4go/internal/s7/Writer.go b/plc4go/internal/s7/Writer.go
index 22761cd09a..46c668cdf2 100644
--- a/plc4go/internal/s7/Writer.go
+++ b/plc4go/internal/s7/Writer.go
@@ -24,6 +24,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/apache/plc4x/plc4go/spi/transactions"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"time"
 
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -58,7 +59,7 @@ func (m Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteRequest
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v", err))
+				result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		parameterItems := make([]readWriteModel.S7VarRequestParameterItem, len(writeRequest.GetTagNames()))
diff --git a/plc4go/internal/simulated/Connection.go b/plc4go/internal/simulated/Connection.go
index f429056a1a..6659f76318 100644
--- a/plc4go/internal/simulated/Connection.go
+++ b/plc4go/internal/simulated/Connection.go
@@ -22,6 +22,7 @@ package simulated
 import (
 	"context"
 	"github.com/apache/plc4x/plc4go/spi/tracer"
+	"runtime/debug"
 	"strconv"
 	"time"
 
@@ -90,7 +91,7 @@ func (c *Connection) ConnectWithContext(_ context.Context) <-chan plc4go.PlcConn
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- _default.NewDefaultPlcConnectionCloseResult(nil, errors.Errorf("panic-ed %v", err))
+				ch <- _default.NewDefaultPlcConnectionCloseResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		// Check if the connection was already connected
@@ -146,7 +147,7 @@ func (c *Connection) Close() <-chan plc4go.PlcConnectionCloseResult {
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v", err))
+				ch <- _default.NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		// Check if the connection is connected.
@@ -192,7 +193,7 @@ func (c *Connection) Ping() <-chan plc4go.PlcConnectionPingResult {
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- _default.NewDefaultPlcConnectionPingResult(errors.Errorf("panic-ed %v", err))
+				ch <- _default.NewDefaultPlcConnectionPingResult(errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		// Check if the connection is connected
diff --git a/plc4go/internal/simulated/Reader.go b/plc4go/internal/simulated/Reader.go
index 4470c3c1b5..41e14052a8 100644
--- a/plc4go/internal/simulated/Reader.go
+++ b/plc4go/internal/simulated/Reader.go
@@ -25,6 +25,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"strconv"
 	"time"
 
@@ -56,7 +57,7 @@ func (r *Reader) Read(_ context.Context, readRequest apiModel.PlcReadRequest) <-
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v", err))
+				ch <- spiModel.NewDefaultPlcReadRequestResult(readRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		var txId string
diff --git a/plc4go/internal/simulated/Writer.go b/plc4go/internal/simulated/Writer.go
index f2fc95cfa0..616c8ace31 100644
--- a/plc4go/internal/simulated/Writer.go
+++ b/plc4go/internal/simulated/Writer.go
@@ -25,6 +25,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"strconv"
 	"time"
 
@@ -55,7 +56,7 @@ func (w *Writer) Write(_ context.Context, writeRequest apiModel.PlcWriteRequest)
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v", err))
+				ch <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		var txId string
diff --git a/plc4go/spi/default/DefaultBrowser.go b/plc4go/spi/default/DefaultBrowser.go
index 34c7ae12b7..af614e445c 100644
--- a/plc4go/spi/default/DefaultBrowser.go
+++ b/plc4go/spi/default/DefaultBrowser.go
@@ -26,6 +26,7 @@ import (
 	spiModel "github.com/apache/plc4x/plc4go/spi/model"
 	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 )
 
 // DefaultBrowserRequirements adds required methods to Browser that are needed when using DefaultBrowser
@@ -74,7 +75,7 @@ func (m *defaultBrowser) BrowseWithInterceptor(ctx context.Context, browseReques
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Interface("err", err).Msg("caught panic")
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		responseCodes := map[string]apiModel.PlcResponseCode{}
diff --git a/plc4go/spi/default/DefaultCodec.go b/plc4go/spi/default/DefaultCodec.go
index ddf2819a03..30b70557b6 100644
--- a/plc4go/spi/default/DefaultCodec.go
+++ b/plc4go/spi/default/DefaultCodec.go
@@ -280,7 +280,7 @@ func (m *defaultCodec) Work(codec DefaultCodecRequirements) {
 	defer func(workerLog zerolog.Logger) {
 		if err := recover(); err != nil {
 			// TODO: If this is an error, cast it to an error and log it with "Err(err)"
-			m.log.Error().Msgf("recovered from: %#v at %s", err, string(debug.Stack()))
+			m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 		}
 		if m.running {
 			workerLog.Warn().Msg("Keep running")
diff --git a/plc4go/spi/default/DefaultConnection.go b/plc4go/spi/default/DefaultConnection.go
index ebbde588cc..2d3a0f9fa5 100644
--- a/plc4go/spi/default/DefaultConnection.go
+++ b/plc4go/spi/default/DefaultConnection.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"github.com/apache/plc4x/plc4go/spi/tracer"
 	"github.com/rs/zerolog"
+	"runtime/debug"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/pkg/api"
@@ -242,7 +243,7 @@ func (d *defaultConnection) ConnectWithContext(ctx context.Context) <-chan plc4g
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v", err))
+				ch <- NewDefaultPlcConnectionConnectResult(nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		err := d.GetMessageCodec().ConnectWithContext(ctx)
@@ -297,7 +298,7 @@ func (d *defaultConnection) Ping() <-chan plc4go.PlcConnectionPingResult {
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				ch <- NewDefaultPlcConnectionPingResult(errors.Errorf("panic-ed %v", err))
+				ch <- NewDefaultPlcConnectionPingResult(errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		if d.GetConnection().IsConnected() {
diff --git a/plc4go/spi/model/DefaultPlcReadRequest.go b/plc4go/spi/model/DefaultPlcReadRequest.go
index 08ebc85e1e..96aa1d0eb4 100644
--- a/plc4go/spi/model/DefaultPlcReadRequest.go
+++ b/plc4go/spi/model/DefaultPlcReadRequest.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"context"
+	"runtime/debug"
 	"time"
 
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -140,7 +141,7 @@ func (d *DefaultPlcReadRequest) ExecuteWithContext(ctx context.Context) <-chan a
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				resultChannel <- NewDefaultPlcReadRequestResult(d, nil, errors.Errorf("panic-ed %v", err))
+				resultChannel <- NewDefaultPlcReadRequestResult(d, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		var subResults []apiModel.PlcReadRequestResult
diff --git a/plc4go/spi/model/DefaultPlcWriteRequest.go b/plc4go/spi/model/DefaultPlcWriteRequest.go
index 35e114f300..54a3f979d7 100644
--- a/plc4go/spi/model/DefaultPlcWriteRequest.go
+++ b/plc4go/spi/model/DefaultPlcWriteRequest.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"context"
+	"runtime/debug"
 	"time"
 
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -162,7 +163,7 @@ func (d *DefaultPlcWriteRequest) ExecuteWithContext(ctx context.Context) <-chan
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				resultChannel <- NewDefaultPlcWriteRequestResult(d, nil, errors.Errorf("panic-ed %v", err))
+				resultChannel <- NewDefaultPlcWriteRequestResult(d, nil, errors.Errorf("panic-ed %v. Stack: %s", err, debug.Stack()))
 			}
 		}()
 		var subResults []apiModel.PlcWriteRequestResult
diff --git a/plc4go/spi/pool/WorkerPool.go b/plc4go/spi/pool/WorkerPool.go
index bcf143bef8..85f3ef8064 100644
--- a/plc4go/spi/pool/WorkerPool.go
+++ b/plc4go/spi/pool/WorkerPool.go
@@ -63,8 +63,8 @@ func (w *worker) work() {
 	w.executor.getWorkerWaitGroup().Add(1)
 	defer w.executor.getWorkerWaitGroup().Done()
 	defer func() {
-		if recovered := recover(); recovered != nil {
-			w.log.Error().Msgf("Recovering from panic():%v. Stack: %s", recovered, debug.Stack())
+		if err := recover(); err != nil {
+			w.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 		}
 		if !w.shutdown.Load() {
 			// if we are not in shutdown we continue
@@ -289,7 +289,7 @@ func (e *dynamicExecutor) Start() {
 		defer e.dynamicWorkers.Done()
 		defer func() {
 			if err := recover(); err != nil {
-				e.log.Error().Msgf("panic-ed %v", err)
+				e.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		workerLog := e.log.With().Str("Worker type", "spawner").Logger()
@@ -339,7 +339,7 @@ func (e *dynamicExecutor) Start() {
 		defer e.dynamicWorkers.Done()
 		defer func() {
 			if err := recover(); err != nil {
-				e.log.Error().Msgf("panic-ed %v", err)
+				e.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		workerLog := e.log.With().Str("Worker type", "killer").Logger()
diff --git a/plc4go/spi/transports/pcap/Transport.go b/plc4go/spi/transports/pcap/Transport.go
index 48f6eabe4e..486450e23b 100644
--- a/plc4go/spi/transports/pcap/Transport.go
+++ b/plc4go/spi/transports/pcap/Transport.go
@@ -33,6 +33,7 @@ import (
 	"github.com/rs/zerolog"
 	"io"
 	"net/url"
+	"runtime/debug"
 	"strconv"
 	"sync"
 	"time"
@@ -141,7 +142,7 @@ func (m *TransportInstance) Connect() error {
 	go func(m *TransportInstance, buffer *bytes.Buffer) {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Msgf("panic-ed %v", err)
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		packageCount := 0
diff --git a/plc4go/spi/transports/utils/DefaultBufferedTransportInstance.go b/plc4go/spi/transports/utils/DefaultBufferedTransportInstance.go
index 922ed57ca3..ac94e35625 100644
--- a/plc4go/spi/transports/utils/DefaultBufferedTransportInstance.go
+++ b/plc4go/spi/transports/utils/DefaultBufferedTransportInstance.go
@@ -22,6 +22,7 @@ package utils
 import (
 	"bufio"
 	"context"
+	"runtime/debug"
 
 	"github.com/apache/plc4x/plc4go/spi/options"
 
@@ -61,7 +62,7 @@ func (m *defaultBufferedTransportInstance) ConnectWithContext(ctx context.Contex
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				m.log.Error().Interface("err", err).Msg("connect panic-ed")
+				m.log.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		ch <- m.Connect()
diff --git a/plc4go/spi/utils/Net.go b/plc4go/spi/utils/Net.go
index cff8137a6f..b3e67e747d 100644
--- a/plc4go/spi/utils/Net.go
+++ b/plc4go/spi/utils/Net.go
@@ -24,6 +24,7 @@ import (
 	"context"
 	"github.com/rs/zerolog"
 	"net"
+	"runtime/debug"
 	"sync"
 	"time"
 
@@ -42,7 +43,7 @@ func GetIPAddresses(localLog zerolog.Logger, ctx context.Context, netInterface n
 	go func() {
 		defer func() {
 			if err := recover(); err != nil {
-				localLog.Error().Msgf("panic-ed %v", err)
+				localLog.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		wg := &sync.WaitGroup{}
@@ -127,7 +128,7 @@ func lockupIpsUsingArp(localLog zerolog.Logger, ctx context.Context, netInterfac
 	go func(handle *pcap.Handle, iface net.Interface, stop chan struct{}) {
 		defer func() {
 			if err := recover(); err != nil {
-				localLog.Error().Msgf("panic-ed %v", err)
+				localLog.Error().Msgf("panic-ed %v. Stack: %s", err, debug.Stack())
 			}
 		}()
 		src := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet)