17 steppedContextAddress canAbort abortButton terminateButton |
17 steppedContextAddress canAbort abortButton terminateButton |
18 continueButton stepButton nextButton sendButton returnButton |
18 continueButton stepButton nextButton sendButton returnButton |
19 restartButton exclusive inspecting nChainShown inspectedProcess |
19 restartButton exclusive inspecting nChainShown inspectedProcess |
20 updateProcess stopButton updateButton monitorToggle stepping |
20 updateProcess stopButton updateButton monitorToggle stepping |
21 steppedContextLineno stepForReturn actualContext inWrap |
21 steppedContextLineno stepForReturn actualContext inWrap |
22 stackInspector steppedContext' |
22 stackInspector steppedContext wrapperContext' |
23 classVariableNames:'CachedDebugger CachedExclusive OpenDebuggers MoreDebuggingDetail |
23 classVariableNames:'CachedDebugger CachedExclusive OpenDebuggers MoreDebuggingDetail |
24 DebuggingDebugger' |
24 DebuggingDebugger' |
25 poolDictionaries:'' |
25 poolDictionaries:'' |
26 category:'Interface-Debugger' |
26 category:'Interface-Debugger' |
27 ! |
27 ! |
1154 "Modified: 14.10.1996 / 13:30:56 / cg" |
1154 "Modified: 14.10.1996 / 13:30:56 / cg" |
1155 ! |
1155 ! |
1156 |
1156 |
1157 stepOrNext |
1157 stepOrNext |
1158 |where here s isWrap method lastWrappedConAddr wrappedMethod |
1158 |where here s isWrap method lastWrappedConAddr wrappedMethod |
1159 inBlock left ignore contextBelow lastWrappedContext| |
1159 inBlock left ignore contextBelow lastWrappedContext |
|
1160 leftWrap enteredWrap| |
1160 |
1161 |
1161 skipLineNr == #return ifTrue:[ |
1162 skipLineNr == #return ifTrue:[ |
1162 name := Processor activeProcess nameOrId. |
1163 name := Processor activeProcess nameOrId. |
1163 self label:('context returned ' , ' (process: ' , name , ')'). |
1164 self label:('context returned ' , ' (process: ' , name , ')'). |
1164 here := thisContext sender sender. |
1165 here := thisContext sender sender. |
1197 " |
1198 " |
1198 kludge to hide breakpoint wrappers in the context list: |
1199 kludge to hide breakpoint wrappers in the context list: |
1199 check if we are in a wrapper methods hidden setup-sequence |
1200 check if we are in a wrapper methods hidden setup-sequence |
1200 if so, ignore the interrupt and continue single sending |
1201 if so, ignore the interrupt and continue single sending |
1201 " |
1202 " |
1202 where := here. |
|
1203 isWrap := false. |
1203 isWrap := false. |
1204 left := false. |
1204 left := false. |
1205 |
1205 leftWrap := enteredWrap := false. |
|
1206 |
|
1207 where := here. |
1206 inWrap ifTrue:[ |
1208 inWrap ifTrue:[ |
1207 wrappedMethod := nil. |
1209 wrappedMethod := nil. |
1208 5 timesRepeat:[ |
1210 5 timesRepeat:[ |
1209 "/ where selector printNL. |
|
1210 (where notNil and:[where isBlockContext not]) ifTrue:[ |
1211 (where notNil and:[where isBlockContext not]) ifTrue:[ |
1211 method := where method. |
1212 method := where method. |
1212 (method notNil and:[method isWrapped]) ifTrue:[ |
1213 (method notNil and:[method isWrapped]) ifTrue:[ |
1213 " |
1214 " |
1214 in a wrapper method |
1215 in a wrapper method |
1219 where sender receiver == method originalMethod ifFalse:[ |
1220 where sender receiver == method originalMethod ifFalse:[ |
1220 isWrap := true. |
1221 isWrap := true. |
1221 ] |
1222 ] |
1222 ] ifFalse:[ |
1223 ] ifFalse:[ |
1223 where == steppedContext ifTrue:[ |
1224 where == steppedContext ifTrue:[ |
1224 "/DebuggingDebugger ifTrue:[ |
1225 |
1225 "/ 'change stepCon from: ' print. |
1226 DebuggingDebugger ifTrue:[ |
1226 "/ steppedContext print. |
1227 'change stepCon from: ' print. |
1227 "/ ' to: ' print. |
1228 steppedContext print. |
1228 "/ lastWrappedContext printNL. |
1229 ' to lastWrapped: ' print. |
1229 "/]. |
1230 lastWrappedContext printNL. |
|
1231 ]. |
|
1232 |
1230 inWrap := false. |
1233 inWrap := false. |
|
1234 leftWrap := true. |
|
1235 wrapperContext := steppedContext. |
1231 steppedContext := lastWrappedContext |
1236 steppedContext := lastWrappedContext |
1232 ] |
1237 ] |
1233 ] |
1238 ] |
1234 ]. |
1239 ]. |
1235 where := where sender |
1240 where := where sender |
1247 "/ |
1252 "/ |
1248 where := nil. here := nil. |
1253 where := nil. here := nil. |
1249 ObjectMemory flushInlineCaches. |
1254 ObjectMemory flushInlineCaches. |
1250 |
1255 |
1251 skipLineNr == #return ifTrue:[ |
1256 skipLineNr == #return ifTrue:[ |
1252 'skipRet in wrap' printCR. |
1257 DebuggingDebugger ifTrue:[ |
|
1258 'skipRet in wrap' printCR. |
|
1259 ] |
1253 ]. |
1260 ]. |
1254 |
1261 |
1255 StepInterruptPending := 1. |
1262 StepInterruptPending := 1. |
1256 InterruptPending := 1. |
1263 InterruptPending := 1. |
1257 InStepInterrupt := nil. |
1264 InStepInterrupt := nil. |
1380 ] ifFalse:[ |
1387 ] ifFalse:[ |
1381 "/ ' send' printNL. |
1388 "/ ' send' printNL. |
1382 " |
1389 " |
1383 a send |
1390 a send |
1384 " |
1391 " |
|
1392 DebuggingDebugger ifTrue:[ |
|
1393 'clear steppedContext' printCR. |
|
1394 ]. |
1385 steppedContext := nil. |
1395 steppedContext := nil. |
1386 s := 'after send' |
1396 s := 'after send' |
1387 ]. |
1397 ]. |
|
1398 |
|
1399 ignore := false. |
|
1400 |
|
1401 " |
|
1402 kludge to hide breakpoint wrappers in the context list: |
|
1403 check if we are in a wrapper methods hidden exit-sequence |
|
1404 if so, ignore the interrupt and continue single sending |
|
1405 " |
|
1406 (where isNil |
|
1407 and:[wrapperContext notNil]) |
|
1408 ifTrue:[ |
|
1409 "/ did not find our steppedContext along the chain; |
|
1410 "/ could be in a wrappedMethods exitBlock ... |
|
1411 |
|
1412 leftWrap ifFalse:[ |
|
1413 where := here. |
|
1414 wrappedMethod := nil. |
|
1415 5 timesRepeat:[ |
|
1416 where notNil ifTrue:[ |
|
1417 where isBlockContext ifFalse:[ |
|
1418 method := where method. |
|
1419 (method notNil and:[method isWrapped]) ifTrue:[ |
|
1420 where == wrapperContext ifTrue:[ |
|
1421 DebuggingDebugger ifTrue:[ |
|
1422 'change stepCon fromWrapped: ' print. |
|
1423 steppedContext print. |
|
1424 ' to: ' print. |
|
1425 wrapperContext printNL. |
|
1426 ]. |
|
1427 |
|
1428 inWrap := true. |
|
1429 enteredWrap := true. |
|
1430 steppedContext := wrapperContext. |
|
1431 wrapperContext := nil. |
|
1432 ] |
|
1433 ]. |
|
1434 ]. |
|
1435 where := where sender |
|
1436 ] |
|
1437 ]. |
|
1438 ]. |
|
1439 enteredWrap ifTrue:[ |
|
1440 ignore := true |
|
1441 ] |
|
1442 ]. |
|
1443 |
|
1444 "/ |
1388 |
1445 |
1389 left ifTrue:[ |
1446 left ifTrue:[ |
1390 "/ special care for stepInterrupt in send, |
1447 "/ special care for stepInterrupt in send, |
1391 "/ when created a dummy context (lineNr == 1) |
1448 "/ when created a dummy context (lineNr == 1) |
1392 |
1449 |
1410 where print. |
1467 where print. |
1411 '[' print. where lineNumber print. ']' printNL. |
1468 '[' print. where lineNumber print. ']' printNL. |
1412 ]. |
1469 ]. |
1413 ]. |
1470 ]. |
1414 |
1471 |
1415 ignore := false. |
1472 ignore ifFalse:[ |
1416 |
1473 |
1417 (bigStep |
1474 (bigStep |
1418 and:[steppedContextLineno notNil |
1475 and:[steppedContextLineno notNil |
1419 and:[where notNil |
1476 and:[where notNil |
1420 and:[where lineNumber == steppedContextLineno]]]) ifTrue:[ |
1477 and:[where lineNumber == steppedContextLineno]]]) ifTrue:[ |
1421 DebuggingDebugger == true ifTrue:[ |
1478 DebuggingDebugger == true ifTrue:[ |
1422 'same line - ignored' printNL. |
1479 'same line - ignored' printNL. |
1423 ]. |
1480 ]. |
1424 ignore := true |
1481 ignore := true |
1425 ]. |
1482 ]. |
1426 |
1483 |
1427 (left not |
1484 (left not |
1428 and:[skipLineNr notNil |
1485 and:[skipLineNr notNil |
1429 and:[where notNil |
1486 and:[where notNil |
1430 and:[where lineNumber < skipLineNr]]]) ifTrue:[ |
1487 and:[where lineNumber < skipLineNr]]]) ifTrue:[ |
1431 DebuggingDebugger == true ifTrue:[ |
1488 DebuggingDebugger == true ifTrue:[ |
1432 'skip (' print. skipLineNr print. ' unreached - ignored' printNL. |
1489 'skip (' print. skipLineNr print. ' unreached - ignored' printNL. |
1433 ]. |
1490 ]. |
1434 ignore := true |
1491 ignore := true |
1435 ]. |
1492 ]. |
1436 |
1493 |
1437 (steppedContextLineno isNil |
1494 (steppedContextLineno isNil |
1438 and:[skipLineNr isNil |
1495 and:[skipLineNr isNil |
1439 and:[thisContext sender selector == #contextInterrupt]]) ifTrue:[ |
1496 and:[thisContext sender selector == #contextInterrupt]]) ifTrue:[ |
1440 DebuggingDebugger == true ifTrue:[ |
1497 DebuggingDebugger == true ifTrue:[ |
1441 'same line2 (after conIRQ) - ignored' printNL. |
1498 'same line2 (after conIRQ) - ignored' printNL. |
1442 ]. |
1499 ]. |
1443 ignore := true |
1500 ignore := true |
|
1501 ]. |
1444 ]. |
1502 ]. |
1445 |
1503 |
1446 ignore ifTrue:[ |
1504 ignore ifTrue:[ |
1447 "/' ' printNL. |
1505 "/' ' printNL. |
1448 where := nil. here := nil. |
1506 where := nil. here := nil. |
1468 bigStep := false. |
1526 bigStep := false. |
1469 |
1527 |
1470 "release refs to context" |
1528 "release refs to context" |
1471 where := nil. here := nil. |
1529 where := nil. here := nil. |
1472 "/'enter' printCR. |
1530 "/'enter' printCR. |
|
1531 |
1473 self enter:thisContext sender sender |
1532 self enter:thisContext sender sender |
1474 |
1533 |
1475 "Created: 14.10.1996 / 12:53:39 / cg" |
1534 "Created: 14.10.1996 / 12:53:39 / cg" |
1476 "Modified: 22.10.1996 / 11:31:44 / cg" |
1535 "Modified: 22.10.1996 / 12:54:33 / cg" |
1477 ! ! |
1536 ! ! |
1478 |
1537 |
1479 !DebugView methodsFor:'menu / button actions'! |
1538 !DebugView methodsFor:'menu / button actions'! |
1480 |
1539 |
1481 autoUpdateOff |
1540 autoUpdateOff |
1592 self interruptProcessWith:[Object abortSignal raise]. |
1651 self interruptProcessWith:[Object abortSignal raise]. |
1593 ]. |
1652 ]. |
1594 ^ self |
1653 ^ self |
1595 ]. |
1654 ]. |
1596 |
1655 |
1597 steppedContext := nil. |
1656 steppedContext := wrapperContext := nil. |
1598 haveControl := false. |
1657 haveControl := false. |
1599 exitAction := #abort. |
1658 exitAction := #abort. |
1600 |
1659 |
1601 "exit private event-loop" |
1660 "exit private event-loop" |
1602 catchBlock notNil ifTrue:[ |
1661 catchBlock notNil ifTrue:[ |
1625 self processPerform:#resume. |
1684 self processPerform:#resume. |
1626 |
1685 |
1627 ^ self |
1686 ^ self |
1628 ]. |
1687 ]. |
1629 canContinue ifTrue:[ |
1688 canContinue ifTrue:[ |
1630 steppedContext := nil. |
1689 steppedContext := wrapperContext := nil. |
1631 tracing := false. |
1690 tracing := false. |
1632 haveControl := false. |
1691 haveControl := false. |
1633 exitAction := #continue. |
1692 exitAction := #continue. |
1634 |
1693 |
1635 "exit private event-loop" |
1694 "exit private event-loop" |
1673 ]. |
1732 ]. |
1674 self interruptProcessWith:[selectedContext unwindAndRestart]. |
1733 self interruptProcessWith:[selectedContext unwindAndRestart]. |
1675 ^ self |
1734 ^ self |
1676 ]. |
1735 ]. |
1677 |
1736 |
1678 steppedContext := nil. |
1737 steppedContext := wrapperContext := nil. |
1679 haveControl := false. |
1738 haveControl := false. |
1680 exitAction := #restart. |
1739 exitAction := #restart. |
1681 |
1740 |
1682 "exit private event-loop" |
1741 "exit private event-loop" |
1683 catchBlock notNil ifTrue:[catchBlock value]. |
1742 catchBlock notNil ifTrue:[catchBlock value]. |
1684 |
1743 |
1685 "/ not reached |
1744 "/ not reached |
1686 'DEBUGGER: oops, restart failed' errorPrintNL. |
1745 'DEBUGGER: oops, restart failed' errorPrintNL. |
1687 restartButton turnOff. |
1746 restartButton turnOff. |
1688 |
1747 |
1689 "Modified: 21.10.1996 / 13:47:35 / cg" |
1748 "Modified: 22.10.1996 / 11:59:28 / cg" |
1690 ! |
1749 ! |
1691 |
1750 |
1692 doReturn |
1751 doReturn |
1693 "return - the selected context will do a ^nil" |
1752 "return - the selected context will do a ^nil" |
1694 |
1753 |
1698 ]. |
1757 ]. |
1699 self interruptProcessWith:[selectedContext unwind]. |
1758 self interruptProcessWith:[selectedContext unwind]. |
1700 ^ self |
1759 ^ self |
1701 ]. |
1760 ]. |
1702 |
1761 |
1703 steppedContext := nil. |
1762 steppedContext := wrapperContext := nil. |
1704 haveControl := false. |
1763 haveControl := false. |
1705 exitAction := #return. |
1764 exitAction := #return. |
1706 |
1765 |
1707 "exit private event-loop" |
1766 "exit private event-loop" |
1708 catchBlock notNil ifTrue:[catchBlock value]. |
1767 catchBlock notNil ifTrue:[catchBlock value]. |
1709 |
1768 |
1710 "/ not reached |
1769 "/ not reached |
1711 'DEBUGGER: oops, return failed' errorPrintNL. |
1770 'DEBUGGER: oops, return failed' errorPrintNL. |
1712 returnButton turnOff. |
1771 returnButton turnOff. |
1713 |
1772 |
1714 "Modified: 21.10.1996 / 13:47:38 / cg" |
1773 "Modified: 22.10.1996 / 11:59:31 / cg" |
1715 ! |
1774 ! |
1716 |
1775 |
1717 doSend |
1776 doSend |
1718 "single send; reenter with next message send" |
1777 "single send; reenter with next message send" |
1719 |
1778 |
1720 inspecting ifTrue:[^ self]. |
1779 inspecting ifTrue:[^ self]. |
1721 |
1780 |
1722 canContinue ifTrue:[ |
1781 canContinue ifTrue:[ |
1723 steppedContext := nil. |
1782 steppedContext := wrapperContext := nil. |
1724 haveControl := false. |
1783 haveControl := false. |
1725 exitAction := #step. |
1784 exitAction := #step. |
1726 |
1785 |
1727 "exit private event-loop" |
1786 "exit private event-loop" |
1728 catchBlock notNil ifTrue:[catchBlock value]. |
1787 catchBlock notNil ifTrue:[catchBlock value]. |
1764 lineNr == -1 ifTrue:[ |
1823 lineNr == -1 ifTrue:[ |
1765 steppedContextLineno := skipLineNr := nil. |
1824 steppedContextLineno := skipLineNr := nil. |
1766 ]. |
1825 ]. |
1767 |
1826 |
1768 steppedContext := con. |
1827 steppedContext := con. |
|
1828 wrapperContext := nil. |
1769 |
1829 |
1770 " |
1830 " |
1771 if we step in a wrapped method, |
1831 if we step in a wrapped method, |
1772 prepare to skip the prolog ... |
1832 prepare to skip the prolog ... |
1773 " |
1833 " |
1824 inspecting ifTrue:[ |
1884 inspecting ifTrue:[ |
1825 self processPerform:#terminate. |
1885 self processPerform:#terminate. |
1826 ^ self |
1886 ^ self |
1827 ]. |
1887 ]. |
1828 |
1888 |
1829 steppedContext := nil. |
1889 steppedContext := wrapperContext := nil. |
1830 haveControl := false. |
1890 haveControl := false. |
1831 exitAction := #terminate. |
1891 exitAction := #terminate. |
1832 |
1892 |
1833 "exit private event-loop" |
1893 "exit private event-loop" |
1834 catchBlock notNil ifTrue:[catchBlock value]. |
1894 catchBlock notNil ifTrue:[catchBlock value]. |
1838 'DEBUGGER: oops, terminate failed' errorPrintNL. |
1898 'DEBUGGER: oops, terminate failed' errorPrintNL. |
1839 self warn:'terminate failed'. |
1899 self warn:'terminate failed'. |
1840 ]. |
1900 ]. |
1841 terminateButton turnOff. |
1901 terminateButton turnOff. |
1842 |
1902 |
1843 "Modified: 21.10.1996 / 13:48:00 / cg" |
1903 "Modified: 22.10.1996 / 11:59:45 / cg" |
1844 ! |
1904 ! |
1845 |
1905 |
1846 doTrace |
1906 doTrace |
1847 "tracing - not really implemented ..." |
1907 "tracing - not really implemented ..." |
1848 |
1908 |
1912 inspecting ifTrue:[ |
1972 inspecting ifTrue:[ |
1913 self processPerform:#terminateNoSignal. |
1973 self processPerform:#terminateNoSignal. |
1914 ^ self |
1974 ^ self |
1915 ]. |
1975 ]. |
1916 |
1976 |
1917 steppedContext := nil. |
1977 steppedContext := wrapperContext := nil. |
1918 haveControl := false. |
1978 haveControl := false. |
1919 exitAction := #quickTerminate. |
1979 exitAction := #quickTerminate. |
1920 |
1980 |
1921 "exit private event-loop" |
1981 "exit private event-loop" |
1922 catchBlock notNil ifTrue:[catchBlock value]. |
1982 catchBlock notNil ifTrue:[catchBlock value]. |
1926 'DEBUGGER: oops, terminate failed' errorPrintNL. |
1986 'DEBUGGER: oops, terminate failed' errorPrintNL. |
1927 self warn:'terminate failed'. |
1987 self warn:'terminate failed'. |
1928 ]. |
1988 ]. |
1929 terminateButton turnOff. |
1989 terminateButton turnOff. |
1930 |
1990 |
1931 "Modified: 21.10.1996 / 13:48:05 / cg" |
1991 "Modified: 22.10.1996 / 11:59:49 / cg" |
1932 ! |
1992 ! |
1933 |
1993 |
1934 removeAllBreakpoints |
1994 removeAllBreakpoints |
1935 "remove all trace & breakpoints - if any" |
1995 "remove all trace & breakpoints - if any" |
1936 |
1996 |
2022 contextInspector release. |
2082 contextInspector release. |
2023 inspectedProcess := nil. |
2083 inspectedProcess := nil. |
2024 exitAction := nil. |
2084 exitAction := nil. |
2025 contextArray := nil. |
2085 contextArray := nil. |
2026 selectedContext := actualContext := nil. |
2086 selectedContext := actualContext := nil. |
2027 steppedContext := nil. |
2087 steppedContext := wrapperContext := nil. |
2028 catchBlock := nil. |
2088 catchBlock := nil. |
2029 grabber := nil. |
2089 grabber := nil. |
2030 self autoUpdateOff. |
2090 self autoUpdateOff. |
2031 |
2091 |
2032 exclusive ifTrue:[CachedExclusive := self] ifFalse:[CachedDebugger := self]. |
2092 exclusive ifTrue:[CachedExclusive := self] ifFalse:[CachedDebugger := self]. |
2033 |
2093 |
2034 "Modified: 21.10.1996 / 13:42:45 / cg" |
2094 "Modified: 22.10.1996 / 11:59:53 / cg" |
2035 ! |
2095 ! |
2036 |
2096 |
2037 exclusive:aBoolean |
2097 exclusive:aBoolean |
2038 exclusive := aBoolean |
2098 exclusive := aBoolean |
2039 ! |
2099 ! |
2599 contextInspector release. |
2659 contextInspector release. |
2600 inspectedProcess := nil. |
2660 inspectedProcess := nil. |
2601 exitAction := nil. |
2661 exitAction := nil. |
2602 contextArray := nil. |
2662 contextArray := nil. |
2603 selectedContext := actualContext := nil. |
2663 selectedContext := actualContext := nil. |
2604 steppedContext := nil. |
2664 steppedContext := wrapperContext := nil. |
2605 grabber := nil. |
2665 grabber := nil. |
2606 self autoUpdateOff. |
2666 self autoUpdateOff. |
2607 |
2667 |
2608 super destroy "/ 1.12.94 |
2668 super destroy "/ 1.12.94 |
2609 |
2669 |
2610 "Modified: 21.10.1996 / 13:43:40 / cg" |
2670 "Modified: 22.10.1996 / 12:00:00 / cg" |
2611 ! |
2671 ! |
2612 |
2672 |
2613 showSelection:lineNr |
2673 showSelection:lineNr |
2614 "user clicked on a header line - show selected code in textView. |
2674 "user clicked on a header line - show selected code in textView. |
2615 Also sent to autoselect an interesting context on entry." |
2675 Also sent to autoselect an interesting context on entry." |