Skip to content

Do not mark empty frame crashes as complete#8119

Merged
bouwkast merged 1 commit intomasterfrom
steven/mark-empty-crash-incomplete
Feb 3, 2026
Merged

Do not mark empty frame crashes as complete#8119
bouwkast merged 1 commit intomasterfrom
steven/mark-empty-crash-incomplete

Conversation

@bouwkast
Copy link
Collaborator

Summary of changes

Checks that frames isn't empty before we mark it as complete. The default from libdatadog is an incomplete crash.

Reason for change

Saw crashes getting sent that had no message and no frames, yet were marked as complete.

Implementation details

Check if frames isn't empty.

Test coverage

None 😢
The tests that I see would need quite a bit of work to be able to mock/test the verify that we don't call ddog_crasht_StackTrace_set_complete

Other details

@bouwkast bouwkast requested a review from a team as a code owner January 30, 2026 15:30
@github-actions github-actions bot added the area:profiler Issues related to the continous-profiler label Jan 30, 2026
@dd-trace-dotnet-ci-bot
Copy link

dd-trace-dotnet-ci-bot bot commented Jan 30, 2026

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8119) and master.

✅ No regressions detected - check the details below

Full Metrics Comparison

FakeDbCommand

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration79.31 ± (79.13 - 79.51) ms79.88 ± (79.77 - 80.12) ms+0.7%✅⬆️
.NET Framework 4.8 - Bailout
duration84.40 ± (84.33 - 84.70) ms84.42 ± (84.19 - 84.58) ms+0.0%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1121.11 ± (1118.66 - 1126.25) ms1133.95 ± (1132.69 - 1138.35) ms+1.1%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms24.30 ± (24.23 - 24.36) ms25.08 ± (25.03 - 25.13) ms+3.2%✅⬆️
process.time_to_main_ms94.22 ± (94.02 - 94.42) ms104.28 ± (104.05 - 104.52) ms+10.7%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.94 ± (10.93 - 10.94) MB15.51 ± (15.51 - 15.52) MB+41.8%✅⬆️
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms24.07 ± (24.01 - 24.13) ms25.12 ± (25.05 - 25.20) ms+4.4%✅⬆️
process.time_to_main_ms94.28 ± (94.04 - 94.52) ms105.99 ± (105.71 - 106.27) ms+12.4%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.97 ± (10.97 - 10.97) MB15.55 ± (15.54 - 15.55) MB+41.7%✅⬆️
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms230.48 ± (227.83 - 233.13) ms294.60 ± (292.15 - 297.05) ms+27.8%✅⬆️
process.time_to_main_ms535.49 ± (534.59 - 536.39) ms570.54 ± (569.51 - 571.57) ms+6.5%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.57 ± (48.55 - 48.60) MB53.14 ± (53.12 - 53.16) MB+9.4%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+1.3%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms22.79 ± (22.75 - 22.84) ms23.29 ± (23.22 - 23.35) ms+2.2%✅⬆️
process.time_to_main_ms81.11 ± (80.93 - 81.29) ms83.47 ± (83.28 - 83.66) ms+2.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.64 ± (10.64 - 10.64) MB10.69 ± (10.69 - 10.69) MB+0.5%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms22.70 ± (22.65 - 22.76) ms23.22 ± (23.14 - 23.29) ms+2.3%✅⬆️
process.time_to_main_ms82.45 ± (82.32 - 82.58) ms84.50 ± (84.31 - 84.69) ms+2.5%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.72 ± (10.72 - 10.73) MB10.80 ± (10.79 - 10.81) MB+0.7%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms234.06 ± (229.89 - 238.23) ms236.01 ± (232.06 - 239.96) ms+0.8%✅⬆️
process.time_to_main_ms507.09 ± (506.08 - 508.09) ms516.19 ± (515.30 - 517.08) ms+1.8%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed49.17 ± (49.15 - 49.20) MB49.24 ± (49.22 - 49.26) MB+0.1%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.2%
.NET 8 - Baseline
process.internal_duration_ms20.51 ± (20.47 - 20.55) ms21.82 ± (21.76 - 21.88) ms+6.4%✅⬆️
process.time_to_main_ms78.03 ± (77.84 - 78.23) ms89.08 ± (88.90 - 89.25) ms+14.2%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.68 ± (7.68 - 7.69) MB12.28 ± (12.27 - 12.28) MB+59.7%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms20.47 ± (20.42 - 20.52) ms21.53 ± (21.45 - 21.60) ms+5.1%✅⬆️
process.time_to_main_ms79.01 ± (78.80 - 79.22) ms90.37 ± (90.14 - 90.61) ms+14.4%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.74 ± (7.73 - 7.75) MB12.34 ± (12.33 - 12.35) MB+59.5%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms196.85 ± (196.07 - 197.62) ms207.91 ± (206.92 - 208.89) ms+5.6%✅⬆️
process.time_to_main_ms484.07 ± (483.12 - 485.03) ms520.73 ± (519.66 - 521.79) ms+7.6%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed37.02 ± (36.98 - 37.05) MB41.67 ± (41.64 - 41.70) MB+12.6%✅⬆️
runtime.dotnet.threads.count27 ± (27 - 27)27 ± (27 - 27)+0.3%✅⬆️

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration203.83 ± (203.44 - 204.53) ms206.47 ± (206.46 - 207.68) ms+1.3%✅⬆️
.NET Framework 4.8 - Bailout
duration206.62 ± (206.50 - 207.47) ms209.08 ± (208.46 - 209.52) ms+1.2%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1188.00 ± (1187.93 - 1194.72) ms1195.23 ± (1193.47 - 1200.92) ms+0.6%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms199.68 ± (199.16 - 200.20) ms200.89 ± (200.35 - 201.43) ms+0.6%✅⬆️
process.time_to_main_ms86.45 ± (86.20 - 86.70) ms86.52 ± (86.26 - 86.79) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.09 ± (16.07 - 16.10) MB16.06 ± (16.04 - 16.08) MB-0.2%
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)-0.1%
.NET Core 3.1 - Bailout
process.internal_duration_ms198.70 ± (198.19 - 199.22) ms202.15 ± (201.51 - 202.80) ms+1.7%✅⬆️
process.time_to_main_ms87.86 ± (87.59 - 88.14) ms89.04 ± (88.68 - 89.40) ms+1.3%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.17 ± (16.15 - 16.18) MB16.09 ± (16.07 - 16.10) MB-0.5%
runtime.dotnet.threads.count21 ± (21 - 21)21 ± (21 - 21)+0.2%✅⬆️
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms424.41 ± (420.95 - 427.87) ms433.35 ± (429.79 - 436.91) ms+2.1%✅⬆️
process.time_to_main_ms504.42 ± (503.42 - 505.43) ms504.08 ± (503.02 - 505.13) ms-0.1%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed59.27 ± (59.17 - 59.38) MB59.12 ± (59.00 - 59.24) MB-0.3%
runtime.dotnet.threads.count29 ± (29 - 30)29 ± (29 - 29)-0.1%
.NET 6 - Baseline
process.internal_duration_ms205.14 ± (204.55 - 205.74) ms214.47 ± (213.52 - 215.42) ms+4.5%✅⬆️
process.time_to_main_ms75.66 ± (75.43 - 75.90) ms83.31 ± (83.00 - 83.62) ms+10.1%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.29 ± (16.27 - 16.31) MB20.72 ± (20.71 - 20.74) MB+27.2%✅⬆️
runtime.dotnet.threads.count19 ± (19 - 19)20 ± (20 - 20)+2.8%✅⬆️
.NET 6 - Bailout
process.internal_duration_ms207.27 ± (206.73 - 207.81) ms214.61 ± (213.77 - 215.46) ms+3.5%✅⬆️
process.time_to_main_ms77.70 ± (77.48 - 77.91) ms84.81 ± (84.52 - 85.10) ms+9.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.34 ± (16.32 - 16.36) MB20.80 ± (20.79 - 20.82) MB+27.4%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)21 ± (21 - 21)+1.2%✅⬆️
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms449.99 ± (445.76 - 454.23) ms484.48 ± (482.47 - 486.49) ms+7.7%✅⬆️
process.time_to_main_ms486.90 ± (485.85 - 487.96) ms512.09 ± (510.95 - 513.23) ms+5.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed59.30 ± (59.12 - 59.48) MB62.40 ± (62.30 - 62.50) MB+5.2%✅⬆️
runtime.dotnet.threads.count30 ± (30 - 30)30 ± (30 - 30)+1.3%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms204.67 ± (204.16 - 205.18) ms208.10 ± (207.35 - 208.84) ms+1.7%✅⬆️
process.time_to_main_ms74.84 ± (74.63 - 75.04) ms81.26 ± (80.94 - 81.57) ms+8.6%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.65 ± (11.63 - 11.66) MB16.17 ± (16.15 - 16.19) MB+38.8%✅⬆️
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)+1.9%✅⬆️
.NET 8 - Bailout
process.internal_duration_ms204.92 ± (204.36 - 205.49) ms205.73 ± (205.13 - 206.32) ms+0.4%✅⬆️
process.time_to_main_ms76.42 ± (76.22 - 76.63) ms81.58 ± (81.39 - 81.78) ms+6.7%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.68 ± (11.67 - 11.69) MB16.30 ± (16.29 - 16.32) MB+39.6%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)+1.6%✅⬆️
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms471.39 ± (464.37 - 478.40) ms414.03 ± (407.33 - 420.72) ms-12.2%
process.time_to_main_ms481.53 ± (480.09 - 482.96) ms493.27 ± (492.16 - 494.38) ms+2.4%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed50.53 ± (50.49 - 50.57) MB54.55 ± (54.39 - 54.70) MB+7.9%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)+1.1%✅⬆️
Comparison explanation

Execution-time benchmarks measure the whole time it takes to execute a program, and are intended to measure the one-off costs. Cases where the execution time results for the PR are worse than latest master results are highlighted in **red**. The following thresholds were used for comparing the execution times:

  • Welch test with statistical test for significance of 5%
  • Only results indicating a difference greater than 5% and 5 ms are considered.

Note that these results are based on a single point-in-time result for each branch. For full results, see the dashboard.

Graphs show the p99 interval based on the mean and StdDev of the test run, as well as the mean value of the run (shown as a diamond below the graph).

Duration charts
FakeDbCommand (.NET Framework 4.8)
gantt
    title Execution time (ms) FakeDbCommand (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8119) - mean (80ms)  : 77, 82
    master - mean (79ms)  : 77, 82

    section Bailout
    This PR (8119) - mean (84ms)  : 82, 87
    master - mean (85ms)  : 83, 86

    section CallTarget+Inlining+NGEN
    This PR (8119) - mean (1,136ms)  : 1095, 1176
    master - mean (1,122ms)  : 1067, 1178

Loading
FakeDbCommand (.NET Core 3.1)
gantt
    title Execution time (ms) FakeDbCommand (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8119) - mean (138ms)  : 134, 142
    master - mean (126ms)  : 123, 129

    section Bailout
    This PR (8119) - mean (140ms)  : crit, 136, 143
    master - mean (126ms)  : 122, 130

    section CallTarget+Inlining+NGEN
    This PR (8119) - mean (901ms)  : crit, 853, 950
    master - mean (808ms)  : 755, 860

Loading
FakeDbCommand (.NET 6)
gantt
    title Execution time (ms) FakeDbCommand (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8119) - mean (114ms)  : 111, 117
    master - mean (111ms)  : 108, 114

    section Bailout
    This PR (8119) - mean (115ms)  : 112, 118
    master - mean (112ms)  : 110, 114

    section CallTarget+Inlining+NGEN
    This PR (8119) - mean (795ms)  : 736, 853
    master - mean (784ms)  : 717, 851

Loading
FakeDbCommand (.NET 8)
gantt
    title Execution time (ms) FakeDbCommand (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8119) - mean (120ms)  : 117, 123
    master - mean (107ms)  : 103, 111

    section Bailout
    This PR (8119) - mean (121ms)  : crit, 117, 125
    master - mean (108ms)  : 105, 111

    section CallTarget+Inlining+NGEN
    This PR (8119) - mean (772ms)  : crit, 751, 793
    master - mean (723ms)  : 698, 749

Loading
HttpMessageHandler (.NET Framework 4.8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8119) - mean (207ms)  : 198, 216
    master - mean (204ms)  : 196, 212

    section Bailout
    This PR (8119) - mean (209ms)  : 201, 217
    master - mean (207ms)  : 200, 213

    section CallTarget+Inlining+NGEN
    This PR (8119) - mean (1,197ms)  : 1141, 1253
    master - mean (1,191ms)  : 1143, 1239

Loading
HttpMessageHandler (.NET Core 3.1)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8119) - mean (297ms)  : 286, 307
    master - mean (296ms)  : 283, 309

    section Bailout
    This PR (8119) - mean (301ms)  : 287, 315
    master - mean (296ms)  : 288, 305

    section CallTarget+Inlining+NGEN
    This PR (8119) - mean (979ms)  : 923, 1035
    master - mean (972ms)  : 910, 1033

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8119) - mean (309ms)  : 288, 329
    master - mean (290ms)  : 276, 304

    section Bailout
    This PR (8119) - mean (309ms)  : 293, 325
    master - mean (294ms)  : 284, 305

    section CallTarget+Inlining+NGEN
    This PR (8119) - mean (1,035ms)  : 988, 1082
    master - mean (979ms)  : 906, 1053

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8119) - mean (301ms)  : 283, 319
    master - mean (291ms)  : 281, 300

    section Bailout
    This PR (8119) - mean (298ms)  : 287, 310
    master - mean (292ms)  : 281, 302

    section CallTarget+Inlining+NGEN
    This PR (8119) - mean (946ms)  : 844, 1048
    master - mean (993ms)  : 877, 1108

Loading

Copy link
Collaborator

@gleocadie gleocadie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@bouwkast bouwkast enabled auto-merge (squash) January 30, 2026 17:57
@bouwkast bouwkast force-pushed the steven/mark-empty-crash-incomplete branch from 1d20078 to 471f570 Compare February 3, 2026 20:00
@pr-commenter
Copy link

pr-commenter bot commented Feb 3, 2026

Benchmarks

Benchmark execution time: 2026-02-03 20:42:15

Comparing candidate commit 471f570 in PR branch steven/mark-empty-crash-incomplete with baseline commit 5cbcfa8 in branch master.

Found 6 performance improvements and 8 performance regressions! Performance is the same for 162 metrics, 16 unstable metrics.

scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net6.0

  • 🟩 execution_time [-80.782ms; -80.635ms] or [-39.524%; -39.452%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody net6.0

  • 🟩 execution_time [-26.516ms; -20.645ms] or [-12.150%; -9.459%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody netcoreapp3.1

  • 🟥 execution_time [+28.690ms; +34.949ms] or [+15.476%; +18.853%]

scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net6.0

  • 🟩 execution_time [-26.032ms; -25.530ms] or [-12.816%; -12.569%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net6.0

  • 🟥 execution_time [+18.847ms; +20.109ms] or [+19.689%; +21.007%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • 🟥 execution_time [+22.452ms; +27.464ms] or [+11.515%; +14.086%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces netcoreapp3.1

  • 🟥 throughput [-168.629op/s; -82.598op/s] or [-11.663%; -5.713%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net6.0

  • 🟩 execution_time [-119.659µs; -112.461µs] or [-10.602%; -9.964%]
  • 🟩 throughput [+98.383op/s; +104.749op/s] or [+11.103%; +11.822%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net6.0

  • 🟥 throughput [-54515.267op/s; -38323.068op/s] or [-8.829%; -6.207%]

scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark netcoreapp3.1

  • 🟥 throughput [-358.525op/s; -161.450op/s] or [-16.924%; -7.621%]

scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net6.0

  • 🟥 execution_time [+11.603ms; +13.111ms] or [+5.765%; +6.515%]

scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog netcoreapp3.1

  • 🟩 throughput [+13477.736op/s; +15614.785op/s] or [+8.003%; +9.271%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net6.0

  • 🟥 execution_time [+15.626ms; +17.236ms] or [+7.772%; +8.572%]

@bouwkast bouwkast merged commit cdaae7e into master Feb 3, 2026
145 of 147 checks passed
@bouwkast bouwkast deleted the steven/mark-empty-crash-incomplete branch February 3, 2026 21:21
@github-actions github-actions bot added this to the vNext-v3 milestone Feb 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:profiler Issues related to the continous-profiler

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants