diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index 97da766c9..819dcc56e 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -802,6 +802,11 @@ void GCode::_do_export(Print &print, FILE *file)
     }
     m_analyzer.set_extruder_offsets(extruder_offsets);
 
+    // send extruders count to analyzer to allow it to detect invalid extruder idxs
+    const ConfigOptionStrings* extruders_opt = dynamic_cast<const ConfigOptionStrings*>(print.config().option("extruder_colour"));
+    const ConfigOptionStrings* filamemts_opt = dynamic_cast<const ConfigOptionStrings*>(print.config().option("filament_colour"));
+    m_analyzer.set_extruders_count(std::max((unsigned int)extruders_opt->values.size(), (unsigned int)filamemts_opt->values.size()));
+
     // tell analyzer about the gcode flavor
     m_analyzer.set_gcode_flavor(print.config().gcode_flavor);
 
diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp
index b28aa558e..89cf9924f 100644
--- a/src/libslic3r/GCode/Analyzer.cpp
+++ b/src/libslic3r/GCode/Analyzer.cpp
@@ -107,6 +107,11 @@ void GCodeAnalyzer::set_extruder_offsets(const GCodeAnalyzer::ExtruderOffsetsMap
     m_extruder_offsets = extruder_offsets;
 }
 
+void GCodeAnalyzer::set_extruders_count(unsigned int count)
+{
+    m_extruders_count = count;
+}
+
 void GCodeAnalyzer::set_gcode_flavor(const GCodeFlavor& flavor)
 {
     m_gcode_flavor = flavor;
@@ -131,6 +136,7 @@ void GCodeAnalyzer::reset()
 
     m_moves_map.clear();
     m_extruder_offsets.clear();
+    m_extruders_count = 1;
 }
 
 const std::string& GCodeAnalyzer::process_gcode(const std::string& gcode)
@@ -520,7 +526,10 @@ void GCodeAnalyzer::_processT(const std::string& cmd)
         unsigned int id = (unsigned int)::strtol(cmd.substr(1).c_str(), nullptr, 10);
         if (_get_extruder_id() != id)
         {
-            _set_extruder_id(id);
+            if (id >= m_extruders_count)
+                BOOST_LOG_TRIVIAL(error) << "GCodeAnalyzer encountered an invalid toolchange, maybe from a custom gcode.";
+            else
+                _set_extruder_id(id);
 
             // stores tool change move
             _store_move(GCodeMove::Tool_change);
diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp
index 47f4e92aa..0372d9da7 100644
--- a/src/libslic3r/GCode/Analyzer.hpp
+++ b/src/libslic3r/GCode/Analyzer.hpp
@@ -108,6 +108,7 @@ private:
     GCodeReader m_parser;
     TypeToMovesMap m_moves_map;
     ExtruderOffsetsMap m_extruder_offsets;
+    unsigned int m_extruders_count;
     GCodeFlavor m_gcode_flavor;
 
     // The output of process_layer()
@@ -117,6 +118,7 @@ public:
     GCodeAnalyzer();
 
     void set_extruder_offsets(const ExtruderOffsetsMap& extruder_offsets);
+    void set_extruders_count(unsigned int count);
 
     void set_gcode_flavor(const GCodeFlavor& flavor);