From 638e4a0f6a85ee7935e9564f2f554edca20f124b Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Sun, 10 Nov 2024 12:20:37 +0500 Subject: [PATCH 1/2] fix(skymp5-server): debug crash --- .../server_guest_lib/MpObjectReference.cpp | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index 459e66ff5d..2d42c9650c 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include "OpenContainerMessage.h" #include "TeleportMessage.h" @@ -128,6 +129,13 @@ struct PrimitiveData GeoProc::GeoPolygonProc polygonProc; }; +struct SetPropertyTrackingInfo +{ + std::string propertyName; + nlohmann::json value; + std::stacktrace trace; +}; + struct MpObjectReference::Impl { public: @@ -137,6 +145,8 @@ struct MpObjectReference::Impl AnimGraphHolder animGraphHolder; std::optional primitive; bool teleportFlag = false; + + std::unique_ptr setPropertyTrackingInfo; bool setPropertyCalled = false; }; @@ -709,6 +719,13 @@ void MpObjectReference::SetProperty(const std::string& propertyName, } } pImpl->setPropertyCalled = true; + + if (GetFormId() == 0xE2218) { + setPropertyTrackingInfo.reset(new SetPropertyTrackingInfo); + setPropertyTrackingInfo->propertyName = propertyName; + setPropertyTrackingInfo->value = newValue; + setPropertyTrackingInfo->trace = std::stacktrace::current(); + } } void MpObjectReference::SetTeleportFlag(bool value) @@ -1129,8 +1146,33 @@ MpChangeForm MpObjectReference::GetChangeForm() const void MpObjectReference::ApplyChangeForm(const MpChangeForm& changeForm) { if (pImpl->setPropertyCalled) { - GetParent()->logger->critical("ApplyChangeForm called after SetProperty"); - std::terminate(); + spdlog::critical( + "MpObjectReference::ApplyChangeForm {:x} - called after SetProperty", + GetFormId()); + + auto& setPropertyTrackingInfo = pImpl->setPropertyTrackingInfo; + + spdlog::critical( + "setPropertyTrackingInfo: propertyName = {}, value = {}", + setPropertyTrackingInfo ? setPropertyTrackingInfo->propertyName + : std::string(""), + setPropertyTrackingInfo ? setPropertyTrackingInfo->value.dump() + : std::string("")); + + std::stringstream ss; + + if (setPropertyTrackingInfo) { + auto trace = setPropertyTrackingInfo->trace; + for (std::size_t i = 0; i < trace.size(); ++i) { + ss << "#" << i << ": " << trace[i] << '\n'; + } + } else { + ss << ""; + } + + spdlog::critical("setPropertyTrackingInfo: trace = {}", ss.str()); + + // std::terminate(); } blockSaving = true; From 4ff55f5ee93fc782048fd97a00226ecc454e755f Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Sun, 10 Nov 2024 12:26:02 +0500 Subject: [PATCH 2/2] . --- skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp index 2d42c9650c..d54be8a03d 100644 --- a/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp +++ b/skymp5-server/cpp/server_guest_lib/MpObjectReference.cpp @@ -1172,6 +1172,8 @@ void MpObjectReference::ApplyChangeForm(const MpChangeForm& changeForm) spdlog::critical("setPropertyTrackingInfo: trace = {}", ss.str()); + pImpl->setPropertyTrackingInfo.reset(); + // std::terminate(); }