Dataverse plug-ins run within a sandbox environment, providing isolation and security. However, crashes in the Sandbox Worker Process can disrupt business logic, cause unexpected failures, and impact system stability.
This blog explores:
✅ Why the Sandbox Worker Process crashes
✅ Common causes and solutions
✅ How to debug crashes using Application Insights
⚠️ Understanding the “Sandbox Worker Process Crashed” Error
🔹 Error Code: -2147204723
🔹 Error Message:
“The plug-in execution failed because the Sandbox Worker process crashed. This is typically due to an error in the plug-in code.”
This error occurs when the Dataverse plug-in sandbox crashes, preventing the execution of plug-ins and workflows.
🔍 Common Causes of Sandbox Worker Process Crashes
The sandbox worker process can crash due to four primary reasons:
1️⃣ Unhandled Exceptions in Plug-in Code
If a plug-in throws an exception without handling it, it crashes the worker process.
🔹 Bad Practice: Calling an external API without handling network failures.
HttpClient client = new HttpClient();
HttpResponseMessage response = client.GetAsync("https://externalapi.com/data").Result;
string result = response.Content.ReadAsStringAsync().Result;
💡 Solution: Always use try-catch and InvalidPluginExecutionException.
try
{
HttpResponseMessage response = client.GetAsync("https://externalapi.com/data").GetAwaiter().GetResult();
response.EnsureSuccessStatusCode();
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException("External API call failed: " + ex.Message);
}
2️⃣ Using Threads Without Exception Handling
Dataverse plug-ins run synchronously and must not spawn new threads.
❌ Bad Practice: Using Task.Run() or Thread.Start()
Task.Run(() => { /* Background work */ });
✅ Solution: Always execute plug-in code synchronously Dataverse does not support multi-threaded plug-ins.
3️⃣ Stack Overflow Errors
A recursive call with no termination condition leads to a StackOverflowException.
❌ Bad Practice: Infinite recursion
public void RecursiveMethod()
{
RecursiveMethod(); // No exit condition
}
✅ Solution: Always include an exit condition
public void RecursiveMethod(int count)
{
if (count <= 0) return;
RecursiveMethod(count - 1);
}
4️⃣ Exceeding Memory Limits
Each sandbox worker process has limited memory. A memory leak can crash the process.
❌ Bad Practice: Storing large objects in memory
List<string> largeData = new List<string>();
while (true)
{
largeData.Add(new string('X', 1000000)); // 1MB per entry
}
✅ Solution: Avoid storing large objects in memory Use RetrieveMultiple wisely and process records in batches.
🚀 Debugging Plug-in Crashes Using Application Insights
When the sandbox worker process crashes, debugging is difficult because traces are lost. Application Insights helps capture error logs and stack traces.
✅ Steps to Enable Application Insights for Plug-ins
1️⃣ Link Application Insights to your Dataverse environment.
2️⃣ Enable logging for plug-in failures
🔹 All unhandled exceptions are logged automatically.
3️⃣ Analyze crash reports in Application Insights:
🔹 Navigate to Failures > Exceptions
🔹 Look for PluginWorkerCrashException
📊 Sample Exception Log in Application Insights
{
"error": {
"code": "0x8004418d",
"message": "Sandbox Worker process crashed due to StackOverflowException."
},
"plugin": {
"name": "MyCompany.PlugIn",
"step": "Create Account",
"solution": "Active"
}
}
🎯 Key Takeaways
✔️ Sandbox Worker Process crashes occur due to unhandled exceptions, stack overflows, and memory leaks.
✔️ Always use exception handling (InvalidPluginExecutionException) to prevent crashes.
✔️ Dataverse plug-ins must run synchronously – avoid multi-threading.
✔️ Application Insights can capture plug-in crash logs for debugging.
🔜 Coming Up Next…
In our next blog, we will explore Transaction Errors in Dataverse Plug-ins, including database commits, rollback scenarios, and debugging transaction failures.
