Sometimes code for a project gets so big and so deeply indirected that debugging is nearly impossible.
We had a bug similar to this where a controller was changing models which triggered avalanches of cascades that no human could follow. The only thing we knew was that a select with an id of elusive
was being changed through jQuery.
After trying in vain to figure out where the change was happening, I had an aha! moment
This is basically how I solved it:
(function($) {
var oldAttr = $.fn.attr;
var oldProp = $.fn.prop;
$.fn.attr = function() {
if (this.id === 'elusive') {
debugger;
}
return oldAttr.apply(this, arguments);
};
$.fn.prop = function() {
if (this.id === 'elusive') {
debugger;
}
return oldProp(this, arguments);
};
})(jQuery);
Then it’s just a matter of looking at the call stack and working backwards from there.