Debugging improvements and clean up.

* Remove unused wxLogDebug calls.
* Add add application level character tracing to detect unhandled key
  events.
* Catch unhandled exceptions in KiCad main event loop like single top
  applications.
This commit is contained in:
Wayne Stambaugh 2021-05-03 16:07:16 -04:00
parent 939b5e1932
commit d2a7f81b10
14 changed files with 79 additions and 57 deletions

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2015-2017 Mario Luzeiro <mrluzeiro@ua.pt> * Copyright (C) 2015-2017 Mario Luzeiro <mrluzeiro@ua.pt>
* Copyright (C) 2015-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2015-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -364,10 +364,3 @@ bool RAYSEG2D::IntersectCircle( const SFVEC2F &aCenter, float aRadius, float *aO
return true; return true;
} }
void RAY::debug() const
{
wxLogDebug( "O(%f, %f, %f) D(%f, %f, %f)\n", m_Origin.x, m_Origin.y, m_Origin.z,
m_Dir.x, m_Dir.y, m_Dir.z );
}

View File

@ -88,10 +88,10 @@ struct RAY
SFVEC3F at( float t ) const { return m_Origin + m_Dir * t; } SFVEC3F at( float t ) const { return m_Origin + m_Dir * t; }
SFVEC2F at2D( float t ) const { SFVEC2F at2D( float t ) const
return SFVEC2F( m_Origin.x + m_Dir.x * t, m_Origin.y + m_Dir.y * t ); } {
return SFVEC2F( m_Origin.x + m_Dir.x * t, m_Origin.y + m_Dir.y * t );
void debug() const; }
}; };

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2015-2020 Mario Luzeiro <mrluzeiro@ua.pt> * Copyright (C) 2015-2020 Mario Luzeiro <mrluzeiro@ua.pt>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -59,13 +59,3 @@ const std::map<OBJECT_2D_TYPE, const char*> objectTypeNames
{ OBJECT_2D_TYPE::BVHCONTAINER, "OBJECT_2D_TYPE::BVHCONTAINER" }, { OBJECT_2D_TYPE::BVHCONTAINER, "OBJECT_2D_TYPE::BVHCONTAINER" },
}; };
// clang-format on // clang-format on
void OBJECT_2D_STATS::PrintStats()
{
for( auto& objectType : objectTypeNames )
{
wxLogDebug( " %20s %u\n", objectType.second,
m_counter[static_cast<int>( objectType.first )] );
}
}

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2015-2016 Mario Luzeiro <mrluzeiro@ua.pt> * Copyright (C) 2015-2016 Mario Luzeiro <mrluzeiro@ua.pt>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -134,8 +134,6 @@ public:
m_counter[static_cast<int>( aObjType )]++; m_counter[static_cast<int>( aObjType )]++;
} }
void PrintStats();
static OBJECT_2D_STATS& Instance() static OBJECT_2D_STATS& Instance()
{ {
if( !s_instance ) if( !s_instance )

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2015-2017 Mario Luzeiro <mrluzeiro@ua.pt> * Copyright (C) 2015-2017 Mario Luzeiro <mrluzeiro@ua.pt>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -377,10 +377,3 @@ void BBOX_3D::ApplyTransformationAA( glm::mat4 aTransformMatrix )
m_min = tmpBBox.m_min; m_min = tmpBBox.m_min;
m_max = tmpBBox.m_max; m_max = tmpBBox.m_max;
} }
void BBOX_3D::debug() const
{
wxLogDebug( "min(%f, %f, %f) - max(%f, %f, %f)\n", m_min.x, m_min.y, m_min.z,
m_max.x, m_max.y, m_max.z );
}

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2015-2016 Mario Luzeiro <mrluzeiro@ua.pt> * Copyright (C) 2015-2016 Mario Luzeiro <mrluzeiro@ua.pt>
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -147,11 +147,6 @@ public:
*/ */
float Volume() const; float Volume() const;
/**
* Output this BBOX_3D to the stdout.
*/
void debug() const;
/** /**
* Check if this bounding box is already initialized. * Check if this bounding box is already initialized.
* *

View File

@ -64,13 +64,13 @@ const std::map<OBJECT_3D_TYPE, const char*> objectTypeNames
// clang-format on // clang-format on
void OBJECT_3D_STATS::PrintStats() // void OBJECT_3D_STATS::PrintStats()
{ // {
wxLogDebug( "OBJECT_3D_STATS:\n" ); // wxLogDebug( "OBJECT_3D_STATS:\n" );
for( auto& objectType : objectTypeNames ) // for( auto& objectType : objectTypeNames )
{ // {
wxLogDebug( " %20s %u\n", objectType.second, // wxLogDebug( " %20s %u\n", objectType.second,
m_counter[static_cast<int>( objectType.first )] ); // m_counter[static_cast<int>( objectType.first )] );
} // }
} // }

View File

@ -127,7 +127,7 @@ public:
m_counter[static_cast<int>( aObjType )]++; m_counter[static_cast<int>( aObjType )]++;
} }
void PrintStats(); // void PrintStats();
static OBJECT_3D_STATS& Instance() static OBJECT_3D_STATS& Instance()
{ {

View File

@ -304,12 +304,13 @@ bool EDA_BASE_FRAME::doAutoSave()
} }
void EDA_BASE_FRAME::OnCharHook( wxKeyEvent& event ) void EDA_BASE_FRAME::OnCharHook( wxKeyEvent& aKeyEvent )
{ {
wxLogTrace( kicadTraceKeyEvent, "EDA_BASE_FRAME::OnCharHook %s", dump( event ) ); wxLogTrace( kicadTraceKeyEvent, "EDA_BASE_FRAME::OnCharHook %s", dump( aKeyEvent ) );
// Key events can be filtered here. // Key events can be filtered here.
// Currently no filtering is made. // Currently no filtering is made.
event.Skip(); aKeyEvent.Skip();
} }

View File

@ -506,6 +506,8 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
{ {
wxKeyEvent* ke = static_cast<wxKeyEvent*>( &aEvent ); wxKeyEvent* ke = static_cast<wxKeyEvent*>( &aEvent );
wxLogTrace( kicadTraceKeyEvent, "TOOL_DISPATCHER::DispatchWxEvent %s", dump( *ke ) );
keyIsEscape = ( ke->GetKeyCode() == WXK_ESCAPE ); keyIsEscape = ( ke->GetKeyCode() == WXK_ESCAPE );
wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( focus ); wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( focus );

View File

@ -253,8 +253,7 @@ wxString dump( const wxKeyEvent& aEvent )
#else #else
" not-set not-set" " not-set not-set"
#endif #endif
" (%5d,%5d)" " (%5d,%5d)",
"\n",
eventType, eventType,
GetKeyName( aEvent ), GetKeyName( aEvent ),
aEvent.GetKeyCode(), aEvent.GetKeyCode(),

View File

@ -234,7 +234,6 @@ static std::mutex s_symbolTableMutex;
SYMBOL_LIB_TABLE* PROJECT::SchSymbolLibTable() SYMBOL_LIB_TABLE* PROJECT::SchSymbolLibTable()
{ {
wxLogDebug( "Getting symbol lib table" );
std::lock_guard<std::mutex> lock( s_symbolTableMutex ); std::lock_guard<std::mutex> lock( s_symbolTableMutex );
// This is a lazy loading function, it loads the project specific table when // This is a lazy loading function, it loads the project specific table when

View File

@ -144,7 +144,7 @@ public:
* function to capture and filter these keys when they are used as hotkeys, and skip it if * function to capture and filter these keys when they are used as hotkeys, and skip it if
* the key is not used as hotkey (otherwise the key events will be not sent to menus). * the key is not used as hotkey (otherwise the key events will be not sent to menus).
*/ */
virtual void OnCharHook( wxKeyEvent& event ); virtual void OnCharHook( wxKeyEvent& aKeyEvent );
/** /**
* The #TOOL_DISPATCHER needs these to work around some issues in wxWidgets where the menu * The #TOOL_DISPATCHER needs these to work around some issues in wxWidgets where the menu

View File

@ -39,8 +39,10 @@
#include <kiway.h> #include <kiway.h>
#include <macros.h> #include <macros.h>
#include <paths.h> #include <paths.h>
#include <richio.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
#include <systemdirsappend.h> #include <systemdirsappend.h>
#include <trace_helpers.h>
#include <wildcards_and_files_ext.h> #include <wildcards_and_files_ext.h>
#include <stdexcept> #include <stdexcept>
@ -328,6 +330,56 @@ struct APP_KICAD : public wxApp
return Event_Skip; return Event_Skip;
} }
#if defined( DEBUG )
/**
* Process any unhandled events at the application level.
*/
bool ProcessEvent( wxEvent& aEvent ) override
{
if( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
{
wxKeyEvent* keyEvent = static_cast<wxKeyEvent*>( &aEvent );
if( keyEvent )
wxLogTrace( kicadTraceKeyEvent, "APP_KICAD::ProcessEvent %s", dump( *keyEvent ) );
}
aEvent.Skip();
return false;
}
/**
* Override main loop exception handling on debug builds.
*
* It can be painfully difficult to debug exceptions that happen in wxUpdateUIEvent
* handlers. The override provides a bit more useful information about the exception
* and a breakpoint can be set to pin point the event where the exception was thrown.
*/
bool OnExceptionInMainLoop() override
{
try
{
throw;
}
catch( const std::exception& e )
{
wxLogError( "Unhandled exception class: %s what: %s",
FROM_UTF8( typeid(e).name() ),
FROM_UTF8( e.what() ) );
}
catch( const IO_ERROR& ioe )
{
wxLogError( ioe.What() );
}
catch(...)
{
wxLogError( "Unhandled exception of unknown type" );
}
return false; // continue on. Return false to abort program
}
#endif
/** /**
* Set MacOS file associations. * Set MacOS file associations.
* *