I had a rare crash of GP just now and I am wondering if I should submit a crash report? The site points us to the community and I don’t see a formal support system option (maybe I just missed it?).
The developers are always keen on crashes, so yes, if you have a crash dump, upload it. You can do that in this the topic you created.
It can be the case that you’re not permitted to upload the file type, but if you make that known, the site administrator will take care of that.
GP crash report 20250524.txt (112.6 KB)
Report attached for dev review.
Saved it to a text file as I am not allowed to upload in its native format.
This is from a MacBook Pro M4 Max running Sequoia 15.4.1.
In general just compress native format as a zip file and upload that.
This seems to be a crash with GPScript.
What exactly were you doing that caused the crash and can you reproduce it?
If I need to upload future crash reports I will zip them.
I was working on some scripting to fetch data from a csv file and populate label widgets with that data. I don’t think I can recreate it but what I was doing was trying out some different Rackspace script versions in a couple of rackspaces in one gig file. This is related to items I have asked about here:
Gig file if you want it:
GP MBP M4.gig (6.3 MB)
Happy to answer any questions you may have.
I was working on this outside of my studio so its not connected to any other gear if that matters.
This crash wasn’t a crisis for me so I am sharing more for posterity and helping the cause than seeking root cause. No software is perfect and sometimes a confluence of events can cause a crash. If anything in this helps improve the product in the future that’s awesome.
It would be really great if you could reproduce this
If I manage to I will certainly share details. If you see anything of note in the report or gig file please let me know. Curious if there is anything interesting in there.
@dhj I had another crash and I think I recreated a similar circumstance to the last crash.
GP was up and running from the time I restarted after the last crash to this one (several days continuous running).Crash report and gig file attached for review. Rackspace script at the time of crash included at the bottom of this post.
Hope this helps!
GigPerformer5-2025-05-30-135714.ips.zip (13.8 KB)
GP MBP M4.gig (8.5 MB)
Actions leading up to crash:
- Was doing various updates to the Rackspace script
- I had just editing and successfully compiled this code snippet
From
if ii == 4 or ii == 5 then
if rowItems[ii] <> "-60.0 dB" then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.024, 0.639, 0.251, 1.0))
else
SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
end
end
to
if ii == 4 then
if rowItems[ii] <> "-60.0 dB" then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.024, 0.639, 0.251, 1.0)) // Bright green for Aux5
else
SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
end
end
if ii == 5 then
if rowItems[ii] <> "-60.0 dB" and rowItems[ii] <> "--" then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.365, 0.435, 0.388, 1.0)) // Muted green for AuxSends
else
SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
end
end
- Compile succeeded.
- Initiated action with the associated button click that launches behavior
//Button to update 828es data and load into GP labels
On WidgetValueChanged(newValue : double) from btnLoad
Print("Button triggered: 828data008.sh")
if newValue == 1.0 then
if RefreshMOTUData() then
Print("Shell script success — now calling LoadFile()")
LoadFile()
else
Print("Shell script failed or did not return success marker.")
end
end
End
- Script started processing and then GP crashed.
Rackspace Script
// Gig Performer GPScript – Load MOTU channel data with label coloring and names
var
// Widgets for 25 rows × 6 fields (Label, Fader, Mute, Solo, Aux5, Aux6)
lbl1_1, lbl1_2, lbl1_3, lbl1_4, lbl1_5, lbl1_6 : Widget
lbl2_1, lbl2_2, lbl2_3, lbl2_4, lbl2_5, lbl2_6 : Widget
lbl3_1, lbl3_2, lbl3_3, lbl3_4, lbl3_5, lbl3_6 : Widget
lbl4_1, lbl4_2, lbl4_3, lbl4_4, lbl4_5, lbl4_6 : Widget
lbl5_1, lbl5_2, lbl5_3, lbl5_4, lbl5_5, lbl5_6 : Widget
lbl6_1, lbl6_2, lbl6_3, lbl6_4, lbl6_5, lbl6_6 : Widget
lbl7_1, lbl7_2, lbl7_3, lbl7_4, lbl7_5, lbl7_6 : Widget
lbl8_1, lbl8_2, lbl8_3, lbl8_4, lbl8_5, lbl8_6 : Widget
lbl9_1, lbl9_2, lbl9_3, lbl9_4, lbl9_5, lbl9_6 : Widget
lbl10_1, lbl10_2, lbl10_3, lbl10_4, lbl10_5, lbl10_6 : Widget
lbl11_1, lbl11_2, lbl11_3, lbl11_4, lbl11_5, lbl11_6 : Widget
lbl12_1, lbl12_2, lbl12_3, lbl12_4, lbl12_5, lbl12_6 : Widget
lbl13_1, lbl13_2, lbl13_3, lbl13_4, lbl13_5, lbl13_6 : Widget
lbl14_1, lbl14_2, lbl14_3, lbl14_4, lbl14_5, lbl14_6 : Widget
lbl15_1, lbl15_2, lbl15_3, lbl15_4, lbl15_5, lbl15_6 : Widget
lbl16_1, lbl16_2, lbl16_3, lbl16_4, lbl16_5, lbl16_6 : Widget
lbl17_1, lbl17_2, lbl17_3, lbl17_4, lbl17_5, lbl17_6 : Widget
lbl18_1, lbl18_2, lbl18_3, lbl18_4, lbl18_5, lbl18_6 : Widget
lbl19_1, lbl19_2, lbl19_3, lbl19_4, lbl19_5, lbl19_6 : Widget
lbl20_1, lbl20_2, lbl20_3, lbl20_4, lbl20_5, lbl20_6 : Widget
lbl21_1, lbl21_2, lbl21_3, lbl21_4, lbl21_5, lbl21_6 : Widget
lbl22_1, lbl22_2, lbl22_3, lbl22_4, lbl22_5, lbl22_6 : Widget
lbl23_1, lbl23_2, lbl23_3, lbl23_4, lbl23_5, lbl23_6 : Widget
lbl24_1, lbl24_2, lbl24_3, lbl24_4, lbl24_5, lbl24_6 : Widget
lbl25_1, lbl25_2, lbl25_3, lbl25_4, lbl25_5, lbl25_6 : Widget
rowRef : Widget Array
btnLoad : Widget //828es load button
motu16aLoad : Widget //16a load button
motu24AoLoad : Widget //24ao load button
motu828Load : Widget //828 load button
motu16aChanLabel : Widget //16a channel label
motu16aNameLabel : Widget //16a name label
motu24aoChanLabel : Widget //24ao channel label
motu24aoNameLabel : Widget //24ao name label
motu828ChanLabel : Widget //828 channel label
motu828NameLabel : Widget //828 name label
arr_lbl_row1 : Widget Array = [lbl1_1, lbl1_2, lbl1_3, lbl1_4, lbl1_5, lbl1_6]
arr_lbl_row2 : Widget Array = [lbl2_1, lbl2_2, lbl2_3, lbl2_4, lbl2_5, lbl2_6]
arr_lbl_row3 : Widget Array = [lbl3_1, lbl3_2, lbl3_3, lbl3_4, lbl3_5, lbl3_6]
arr_lbl_row4 : Widget Array = [lbl4_1, lbl4_2, lbl4_3, lbl4_4, lbl4_5, lbl4_6]
arr_lbl_row5 : Widget Array = [lbl5_1, lbl5_2, lbl5_3, lbl5_4, lbl5_5, lbl5_6]
arr_lbl_row6 : Widget Array = [lbl6_1, lbl6_2, lbl6_3, lbl6_4, lbl6_5, lbl6_6]
arr_lbl_row7 : Widget Array = [lbl7_1, lbl7_2, lbl7_3, lbl7_4, lbl7_5, lbl7_6]
arr_lbl_row8 : Widget Array = [lbl8_1, lbl8_2, lbl8_3, lbl8_4, lbl8_5, lbl8_6]
arr_lbl_row9 : Widget Array = [lbl9_1, lbl9_2, lbl9_3, lbl9_4, lbl9_5, lbl9_6]
arr_lbl_row10 : Widget Array = [lbl10_1, lbl10_2, lbl10_3, lbl10_4, lbl10_5, lbl10_6]
arr_lbl_row11 : Widget Array = [lbl11_1, lbl11_2, lbl11_3, lbl11_4, lbl11_5, lbl11_6]
arr_lbl_row12 : Widget Array = [lbl12_1, lbl12_2, lbl12_3, lbl12_4, lbl12_5, lbl12_6]
arr_lbl_row13 : Widget Array = [lbl13_1, lbl13_2, lbl13_3, lbl13_4, lbl13_5, lbl13_6]
arr_lbl_row14 : Widget Array = [lbl14_1, lbl14_2, lbl14_3, lbl14_4, lbl14_5, lbl14_6]
arr_lbl_row15 : Widget Array = [lbl15_1, lbl15_2, lbl15_3, lbl15_4, lbl15_5, lbl15_6]
arr_lbl_row16 : Widget Array = [lbl16_1, lbl16_2, lbl16_3, lbl16_4, lbl16_5, lbl16_6]
arr_lbl_row17 : Widget Array = [lbl17_1, lbl17_2, lbl17_3, lbl17_4, lbl17_5, lbl17_6]
arr_lbl_row18 : Widget Array = [lbl18_1, lbl18_2, lbl18_3, lbl18_4, lbl18_5, lbl18_6]
arr_lbl_row19 : Widget Array = [lbl19_1, lbl19_2, lbl19_3, lbl19_4, lbl19_5, lbl19_6]
arr_lbl_row20 : Widget Array = [lbl20_1, lbl20_2, lbl20_3, lbl20_4, lbl20_5, lbl20_6]
arr_lbl_row21 : Widget Array = [lbl21_1, lbl21_2, lbl21_3, lbl21_4, lbl21_5, lbl21_6]
arr_lbl_row22 : Widget Array = [lbl22_1, lbl22_2, lbl22_3, lbl22_4, lbl22_5, lbl22_6]
arr_lbl_row23 : Widget Array = [lbl23_1, lbl23_2, lbl23_3, lbl23_4, lbl23_5, lbl23_6]
arr_lbl_row24 : Widget Array = [lbl24_1, lbl24_2, lbl24_3, lbl24_4, lbl24_5, lbl24_6]
arr_lbl_row25 : Widget Array = [lbl25_1, lbl25_2, lbl25_3, lbl25_4, lbl25_5, lbl25_6]
// Function to refresh MOTU data using ShellEx and check for success marker
function RefreshMOTUData() returns Boolean
var shellResult, markerCheck : String
var result : Boolean
//Print("Button triggered: 828data004.sh")
// Run the shell script using bash
shellResult = ShellEx("bash -c \"'/Users/mbpm4/Documents/Gig Performer/828data008.sh'\"")
Print("=== ShellEx Output ===")
Print(shellResult)
Print("Length of output: " + IntToString(Length(shellResult)))
// Check for success marker using workaround
markerCheck = StringUpToFirstOccurrence(shellResult, "MOTU SCRIPT SUCCESS", false, false)
result = Length(markerCheck) < Length(shellResult)
if result then
Print("✅ Script success marker detected.")
else
Print("❌ Script failed or success marker missing.")
end
end
function LoadFile()
var i, ii : Integer
var row : String
var rows, rowItems : String Array
var labelLen : Integer
var suffix6, suffix10 : String
var formatSuffix : String
var newline : String = <<<
>>>
var textfile, dbStr, fmt : String
var dbVal, t, shade, greenVal : double
textfile = LoadStringFromTextFile("/Users/mbpm4/Documents/Gig Performer/828es_motu_values.txt")
while textfile <> "" do
row = StringUpToFirstOccurrence(textfile, newline, false, false)
row = StringUpToFirstOccurrence(row, "//", false, false)
if row <> "" then rows <-- row end
textfile = StringAfterFirstOccurrence(textfile, newline, false, false)
end
for i = 1; i <= 25 and i < Size(rows); i = i + 1 do
rowItems = ParseCSVString(rows[i])
select
i == 1 do rowRef = arr_lbl_row1
i == 2 do rowRef = arr_lbl_row2
i == 3 do rowRef = arr_lbl_row3
i == 4 do rowRef = arr_lbl_row4
i == 5 do rowRef = arr_lbl_row5
i == 6 do rowRef = arr_lbl_row6
i == 7 do rowRef = arr_lbl_row7
i == 8 do rowRef = arr_lbl_row8
i == 9 do rowRef = arr_lbl_row9
i == 10 do rowRef = arr_lbl_row10
i == 11 do rowRef = arr_lbl_row11
i == 12 do rowRef = arr_lbl_row12
i == 13 do rowRef = arr_lbl_row13
i == 14 do rowRef = arr_lbl_row14
i == 15 do rowRef = arr_lbl_row15
i == 16 do rowRef = arr_lbl_row16
i == 17 do rowRef = arr_lbl_row17
i == 18 do rowRef = arr_lbl_row18
i == 19 do rowRef = arr_lbl_row19
i == 20 do rowRef = arr_lbl_row20
i == 21 do rowRef = arr_lbl_row21
i == 22 do rowRef = arr_lbl_row22
i == 23 do rowRef = arr_lbl_row23
i == 24 do rowRef = arr_lbl_row24
i == 25 do rowRef = arr_lbl_row25
end
for ii = 0; ii < 6; ii = ii + 1 do
if ii == 5 then
// Replace semicolons with newline characters for better display
rowItems[ii] = ReplaceString(rowItems[ii], ";", newline, true)
end
SetWidgetLabel(rowRef[ii], rowItems[ii])
// Color the format label
if ii == 0 then
formatSuffix = StringAfterFirstOccurrence(rowItems[ii], "(", false, false)
if formatSuffix == "Mono)" then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.5, 0.7, 1.0, 1.0)) // Light blue
elsif formatSuffix == "Stereo L)" or formatSuffix == "Stereo R)" then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.3, 0.5, 1.0, 1.0)) // Medium blue
else
SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0)) // Fallback gray
end
end
if ii == 1 then
dbStr = StringUpToFirstOccurrence(rowItems[ii], " dB", false, false)
dbVal = StringToDouble(dbStr)
if dbVal <= -60.0 then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
elsif dbVal > -60.0 and dbVal <= 0.0 then
t = (dbVal + 60.0) / 60.0
shade = 0.235 + (0.75 - 0.235) * t
SetWidgetFillColor(rowRef[ii], RGBToColor(shade, shade, shade, 1.0))
elsif dbVal > 0.0 and dbVal <= 12.0 then
t = dbVal / 12.0
greenVal = 1.0 - t
SetWidgetFillColor(rowRef[ii], RGBToColor(1.0, greenVal, 0.0, 1.0))
else
SetWidgetFillColor(rowRef[ii], RGBToColor(0.249,0.255,0.275, 1.0))
end
end
if ii == 2 then
if rowItems[ii] == "On" then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.976, 0.027, 0.027, 1.0))
else
SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
end
end
if ii == 3 then
if rowItems[ii] == "On" then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.749, 0.690, 0.133, 1.0))
else
SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
end
end
if ii == 4 then
if rowItems[ii] <> "-60.0 dB" then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.024, 0.639, 0.251, 1.0)) // Bright green for Aux5
else
SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
end
end
if ii == 5 then
if rowItems[ii] <> "-60.0 dB" and rowItems[ii] <> "--" then
SetWidgetFillColor(rowRef[ii], RGBToColor(0.365, 0.435, 0.388, 1.0)) // Muted green for AuxSends
else
SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
end
end
end
end
End
//Button to update 828es data and load into GP labels
On WidgetValueChanged(newValue : double) from btnLoad
Print("Button triggered: 828data008.sh")
if newValue == 1.0 then
if RefreshMOTUData() then
Print("Shell script success — now calling LoadFile()")
LoadFile()
else
Print("Shell script failed or did not return success marker.")
end
end
End
//=======================================================================
//+++++++ Right Panel buttons for MOTU channels and Mix In names ++++++++
//=======================================================================
//AUTOMATE 16a Channel and Name collecction script
function RefreshMOTU16aData() returns Boolean
var shellResult16a, markerCheck16a : String
var result : Boolean
Print("Button triggered: 16adata001.sh")
// Run the shell script using bash
shellResult16a = ShellEx("bash -c \"'/Users/mbpm4/Documents/Gig Performer/16adata001.sh'\"")
Print("=== ShellEx Output ===")
Print(shellResult16a)
Print("Length of output: " + IntToString(Length(shellResult16a)))
// Check for success marker using workaround
markerCheck16a = StringUpToFirstOccurrence(shellResult16a, "MOTU SCRIPT SUCCESS", false, false)
result = Length(markerCheck16a) < Length(shellResult16a)
if result then
Print("✅ Script success marker detected.")
else
Print("❌ Script failed or success marker missing.")
end
end
//Update 16a data
function LoadFile16a()
var textfile, line, chan, name : String
var newline : String = <<<
>>>
var chanLines, nameLines : String = ""
var lineNum : Integer = 0
textfile = LoadStringFromTextFile("/Users/mbpm4/Documents/Gig Performer/motu16a_values.txt")
// Skip header row
textfile = StringAfterFirstOccurrence(textfile, newline, false, false)
while textfile <> "" do
line = StringUpToFirstOccurrence(textfile, newline, false, false)
textfile = StringAfterFirstOccurrence(textfile, newline, false, false)
// Find comma and split manually
if line <> "" then
lineNum = lineNum + 1
chan = StringUpToFirstOccurrence(line, ",", false, false)
name = StringAfterFirstOccurrence(line, ",", false, false)
// Only add if there's a name
if name <> "" then
// Pad channel string for alignment (max 2-digit channels)
if Length(chan) == 1 then
chan = " " + chan
end
chanLines = chanLines + chan + " " + newline
nameLines = nameLines + name + newline
end
end
end
SetWidgetLabel(motu16aChanLabel, chanLines)
SetWidgetLabel(motu16aNameLabel, nameLines)
end
//AUTOMATE 24ao Channel and Name collecction script
function RefreshMOTU24aoData() returns Boolean
var shellResult24ao, markerCheck24ao : String
var result : Boolean
Print("Button triggered: 24aodata001.sh")
// Run the shell script using bash
shellResult24ao = ShellEx("bash -c \"'/Users/mbpm4/Documents/Gig Performer/24Aodata001.sh'\"")
Print("=== ShellEx Output ===")
Print(shellResult24ao)
Print("Length of output: " + IntToString(Length(shellResult24ao)))
// Check for success marker using workaround
markerCheck24ao = StringUpToFirstOccurrence(shellResult24ao, "MOTU SCRIPT SUCCESS", false, false)
result = Length(markerCheck24ao) < Length(shellResult24ao)
if result then
Print("✅ Script success marker detected.")
else
Print("❌ Script failed or success marker missing.")
end
end
//Update 24Ao data
function LoadFile24ao()
var textfile, line, chan, name : String
var newline : String = <<<
>>>
var chanLines, nameLines : String = ""
var lineNum : Integer = 0
textfile = LoadStringFromTextFile("/Users/mbpm4/Documents/Gig Performer/motu24Ao_values.txt")
// Skip header row
textfile = StringAfterFirstOccurrence(textfile, newline, false, false)
while textfile <> "" do
line = StringUpToFirstOccurrence(textfile, newline, false, false)
textfile = StringAfterFirstOccurrence(textfile, newline, false, false)
// Find comma and split manually
if line <> "" then
lineNum = lineNum + 1
chan = StringUpToFirstOccurrence(line, ",", false, false)
name = StringAfterFirstOccurrence(line, ",", false, false)
// Only add if there's a name
if name <> "" then
// Pad channel string for alignment (max 2-digit channels)
if Length(chan) == 1 then
chan = " " + chan
end
chanLines = chanLines + chan + " " + newline
nameLines = nameLines + name + newline
end
end
end
SetWidgetLabel(motu24aoChanLabel, chanLines)
SetWidgetLabel(motu24aoNameLabel, nameLines)
end
//AUTOMATE 828 Channel and Name collecction script
function RefreshMOTU828Data() returns Boolean
var shellResult828, markerCheck828 : String
var result : Boolean
Print("Button triggered: 828data001.sh")
// Run the shell script using bash
shellResult828 = ShellEx("bash -c '/Users/mbpm4/Documents/Gig\\ Performer/828data001.sh'")
//OLD shellResult828 = ShellEx("bash -c \"'/Users/mbpm4/Documents/Gig Performer/828adata001.sh'\"")
Print("Running shell command: bash -c '/Users/mbpm4/Documents/Gig\\ Performer/828data001.sh'")
Print("=== ShellEx Output ===")
Print(shellResult828)
Print("Length of output: " + IntToString(Length(shellResult828)))
// Check for success marker using workaround
markerCheck828 = StringUpToFirstOccurrence(shellResult828, "MOTU SCRIPT SUCCESS", false, false)
result = Length(markerCheck828) < Length(shellResult828)
if result then
Print("✅ Script success marker detected.")
else
Print("❌ Script failed or success marker missing.")
end
end
//Update 828 data
function LoadFile828()
var textfile, line, chan, name : String
var newline : String = <<<
>>>
var chanLines, nameLines : String = ""
var lineNum : Integer = 0
textfile = LoadStringFromTextFile("/Users/mbpm4/Documents/Gig Performer/motu828_values.txt")
// Skip header row
textfile = StringAfterFirstOccurrence(textfile, newline, false, false)
while textfile <> "" do
line = StringUpToFirstOccurrence(textfile, newline, false, false)
textfile = StringAfterFirstOccurrence(textfile, newline, false, false)
// Find comma and split manually
if line <> "" then
lineNum = lineNum + 1
chan = StringUpToFirstOccurrence(line, ",", false, false)
name = StringAfterFirstOccurrence(line, ",", false, false)
// Only add if there's a name
if name <> "" then
// Pad channel string for alignment (max 2-digit channels)
if Length(chan) == 1 then
chan = " " + chan
end
chanLines = chanLines + chan + " " + newline
nameLines = nameLines + name + newline
end
end
end
SetWidgetLabel(motu828ChanLabel, chanLines)
SetWidgetLabel(motu828NameLabel, nameLines)
end
//Load 16a button
On WidgetValueChanged(newValue : double) from motu16aLoad
//Print("Button triggered: 16A")
if newValue == 1.0 then
if RefreshMOTU16aData() then
Print("Shell script success — now calling LoadFile()")
LoadFile16a()
else
Print("Shell script failed or did not return success marker.")
end
end
End
//Load 24Ao button
On WidgetValueChanged(newValue : double) from motu24AoLoad
//Print("Button triggered: 24Ao")
if newValue == 1.0 then
if RefreshMOTU24aoData() then
Print("Shell script success — now calling LoadFile()")
LoadFile24ao()
else
Print("Shell script failed or did not return success marker.")
end
end
End
//Load 828 button
On WidgetValueChanged(newValue : double) from motu828Load
//Print("Button triggered: 828")
if newValue == 1.0 then
if RefreshMOTU828Data() then
Print("Shell script success — now calling LoadFile()")
LoadFile828()
else
Print("Shell script failed or did not return success marker.")
end
end
End