Tcl Source Code

View Ticket
Login
Ticket UUID: 46f801ea5a25e2885588864ef2096fff09edd08a
Title: Tcl bug: unexpected stack trace in "unknown"
Type: Bug Version: 8.6.6
Submitter: bigfaceworm Created on: 2017-06-06 18:34:56
Subsystem: 18. Commands M-Z Assigned To: dgp
Priority: 5 Medium Severity: Minor
Status: Open Last Modified: 2017-06-26 19:20:27
Resolution: None Closed By: nobody
    Closed on:
Description:
Unsure how to reproduce outside of my application (trying to port from 8.4 to 8.6).  I tried, but cannot.  So I'm providing the errorInfo and errorCode that result from this problem.  It *appears* to be related to a call through incr Tcl, and perhaps *its* unknown method, which calls ::tailcall, and maybe that messes up the expected call stack.

errorInfo:

Tcl bug: unexpected stack trace in "unknown"
    while executing
"error "Tcl bug: unexpected stack trace in \"unknown\"" {}  [list CORE UNKNOWN BADTRACE $einfo $expect $errInfo]"
    (procedure "::unknown" line 92)
    invoked from within
"CConsoleMainWindow $m_consoleMainWindow $this"
    while constructing object "::CConsoleApp::cConsoleApp0" in ::CConsoleApp::constructor (body line 28)
    invoked from within
"::itcl::parser::handleClass CConsoleApp ::CConsoleApp #auto"
    invoked from within
"CConsoleApp #auto"
    (object "::CCmdCalConsoleStartup::cCmdCalConsoleStartup0" method "::CCmdCalConsoleStartup::Execute" body line 4)
    invoked from within
"::CConsoleApp::Create"
    (object "::CCmdCalConsoleStartup::cCmdCalConsoleStartup0" method "::CCmdCalConsoleStartup::Execute" body line 6)
    invoked from within
"$cmdConsoleStartup Execute"
    (procedure "rve_OpenSpiceFile" line 8)
    invoked from within
"rve_OpenSpiceFile $arg1 1 $spiceTopCell"
    (procedure "rve_startup" line 36)
    invoked from within
"rve_startup"


errorCode:

CORE UNKNOWN BADTRACE {
    (while configuring option "-iconclosebtn" for widget "::.m_consoleMainWindow.m_mainPaneManager.m_termPaneFrame")
    invoked from within
"::itcl::builtin::Archetype configure $option {*}$args"
    (object "::.m_consoleMainWindow.m_mainPaneManager.m_termPaneFrame" method "::itk::Archetype::configure" body line 2)
    invoked from within
"$paneFrame configure  -background [option get . mutedBackground MutedBackground]  -activebackground [option get . selectBackground SelectBackground]  ..."
    (object "::CConsoleApp::.m_consoleMainWindow" method "::CConsoleMainWindow::CreatePaneFrames" body line 18)
    invoked from within
"::CPaneFrameHelper::Initialize $m_termPaneFrame"
    (object "::CConsoleApp::.m_consoleMainWindow" method "::CConsoleMainWindow::CreatePaneFrames" body line 44)
    invoked from within
"$this CreatePaneFrames"
    while constructing object "::CConsoleApp::.m_consoleMainWindow" in ::CConsoleMainWindow::constructor (body line 41)
    invoked from within
"::itcl::parser::handleC} {
    invoked from within
"CConsoleMainWindow .m_consoleMainWindow ::CConsoleApp::cConsoleApp0"
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 $args"} {
    (while configuring option "-iconclosebtn" for widget "::.m_consoleMainWindow.m_mainPaneManager.m_termPaneFrame")
    invoked from within
"::itcl::builtin::Archetype configure $option {*}$args"
    (object "::.m_consoleMainWindow.m_mainPaneManager.m_termPaneFrame" method "::itk::Archetype::configure" body line 2)
    invoked from within
"$paneFrame configure  -background [option get . mutedBackground MutedBackground]  -activebackground [option get . selectBackground SelectBackground]  ..."
    (object "::CConsoleApp::.m_consoleMainWindow" method "::CConsoleMainWindow::CreatePaneFrames" body line 18)
    invoked from within
"::CPaneFrameHelper::Initialize $m_termPaneFrame"
    (object "::CConsoleApp::.m_consoleMainWindow" method "::CConsoleMainWindow::CreatePaneFrames" body line 44)
    invoked from within
"$this CreatePaneFrames"
    while constructing object "::CConsoleApp::.m_consoleMainWindow" in ::CConsoleMainWindow::constructor (body line 41)
    invoked from within
"::itcl::parser::handleClass CConsoleMainWindow ::CConsoleMainWindow .m_consoleMainWindow ::CConsoleApp::cConsoleApp0"
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 $args"}

additionally, the 3 variables mentioned in the unexpected stack trace have the following values:

einfo:

 {
    (while configuring option "-iconclosebtn" for widget "::.m_consoleMainWindow.m_mainPaneManager.m_termPaneFrame")
    invoked from within
"::itcl::builtin::Archetype configure $option {*}$args"
    (object "::.m_consoleMainWindow.m_mainPaneManager.m_termPaneFrame" method "::itk::Archetype::configure" body line 2)
    invoked from within
"$paneFrame configure  -background [option get . mutedBackground MutedBackground]  -activebackground [option get . selectBackground SelectBackground]  ..."
    (object "::CConsoleApp::.m_consoleMainWindow" method "::CConsoleMainWindow::CreatePaneFrames" body line 18)
    invoked from within
"::CPaneFrameHelper::Initialize $m_termPaneFrame"
    (object "::CConsoleApp::.m_consoleMainWindow" method "::CConsoleMainWindow::CreatePaneFrames" body line 44)
    invoked from within
"$this CreatePaneFrames"
    while constructing object "::CConsoleApp::.m_consoleMainWindow" in ::CConsoleMainWindow::constructor (body line 41)
    invoked from within
"::itcl::parser::handleC}

expect:

{
    invoked from within
"CConsoleMainWindow .m_consoleMainWindow ::CConsoleApp::cConsoleApp0"
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 $args"}

errInfo:

{
    (while configuring option "-iconclosebtn" for widget "::.m_consoleMainWindow.m_mainPaneManager.m_termPaneFrame")
    invoked from within
"::itcl::builtin::Archetype configure $option {*}$args"
    (object "::.m_consoleMainWindow.m_mainPaneManager.m_termPaneFrame" method "::itk::Archetype::configure" body line 2)
    invoked from within
"$paneFrame configure  -background [option get . mutedBackground MutedBackground]  -activebackground [option get . selectBackground SelectBackground]  ..."
    (object "::CConsoleApp::.m_consoleMainWindow" method "::CConsoleMainWindow::CreatePaneFrames" body line 18)
    invoked from within
"::CPaneFrameHelper::Initialize $m_termPaneFrame"
    (object "::CConsoleApp::.m_consoleMainWindow" method "::CConsoleMainWindow::CreatePaneFrames" body line 44)
    invoked from within
"$this CreatePaneFrames"
    while constructing object "::CConsoleApp::.m_consoleMainWindow" in ::CConsoleMainWindow::constructor (body line 41)
    invoked from within
"::itcl::parser::handleClass CConsoleMainWindow ::CConsoleMainWindow .m_consoleMainWindow ::CConsoleApp::cConsoleApp0"
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 $args"}


there's some truncation going on with the itcl::parser::handleClass
User Comments: dgp added on 2017-06-26 19:20:27:
Committed fix for the worst symptom; failure when
unable to achieve perfect stack trace consistency.

Better to have an imperfect result than no result at all.

Still open questions about how [tailcall] properly
should append to -errorinfo.

dgp added on 2017-06-23 18:39:59:
The question about how [tailcall] should add to
-errorinfo arose in the context of working on
this Itcl bug.

https://sourceforge.net/p/incrtcl/bugs/269/

dgp added on 2017-06-23 16:05:57:
Ok, see branches dgp-tailcall-errorinfo and dgp-tailcall-errorinfo-alt.

Apparently I ran into related issues back in Dec. 2015.

dgp added on 2017-06-23 14:21:13:
I think there's a related question here 
regarding whether [tailcall] does "the
right thing" with stack traces in the first
place.  I recall encountering that question
before, but I have not yet located any
tickets or other notes about it.

dgp added on 2017-06-23 13:33:05:
bigfaceworm had the right idea. The autoloader
doesn't cope with [tailcall] or any other mechanism
where a command can erase itself from the stack trace.
Simplified demo:

% array set auto_index {demo {proc demo {} {tailcall error foo}}}
% demo
Tcl bug: unexpected stack trace in "unknown"

Since Itcl 4 started using [tailcall] in its fundamentals,
this flaw hurts autoloaded Itcl code bad, and that's a bad
habit most Itcl users persist in.

dgp added on 2017-06-06 20:04:00:
This will probably be hard to isolate and
diagnose.

In the meanwhile, you may find a quick workaround
is to just stop using the auto-loader.

ferrieux added on 2017-06-06 19:37:00:
In addition to ::errorInfo, [info errorstack] will give you the actual values passed to each level. That may or may not help.