- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在PostScript中进行调试?我可以在Linux上使用GhostView / GhostScript,但无法查看堆栈,字典等。
最佳答案
最小调试器
我刚刚发现了一个非常有用的技巧。
<<
/break{ /hook /pause load store }
/cont{ /hook {} store }
/doprompt{
(\nbreak>)print
flush(%lineedit)(r)file
cvx {exec}stopped pop }
/pause{ doprompt }
/hook{}
>> begin
hook
放入主循环中,将
break
放入一个过程中,以在下一个钩子上触发暂停(我将其放入可疑的OPCODE proc中,并且钩子在中断生效的位置)。挂机呼叫暂停和暂停呼叫
doprompt
,这将为您提供单行“ break>”提示。在此处键入
cont
将清除钩子并继续旋转,直到遇到另一个
break
为止,不执行任何暂停。您也可以在提示符下检查值并执行代码,但请注意。当您按Enter键时,执行恢复,因此,如果您需要其他行,请在该行的末尾调用
doprompt
或
pause
。执行命令时将忽略错误(您不希望调试器使程序崩溃,这很愚蠢!)。我想我可以结合使用“暂停”和“提示”来消除名字。但是这里的目标不是提高机器效率,而是清晰地收集概念:此代码对于调试其他代码非常有用,需要易于扫描和验证。
=
和
==
来调查值。
forall
和
get
破坏数组和内容。要真正找出您所在的位置,请对整个caboodle进行可读的转储
countexecstack array execstack ==
。也就是说,执行堆栈中当前位置的回溯,其中包含所有部分执行的过程和文件的尾部,当当前帧返回时,这些尾部等待恢复。
printf
),无需调试器本身就可以完成很多调试工作。
/E [ 0 0 10 ] def %eye point
/crackE { % set pointers into E
/ex E 0 1 getinterval cvx def
/ey E 1 1 getinterval cvx def
/ez E 2 1 getinterval cvx def
} def crackE
GPL Ghostscript 8.62 (2008-02-29)
Copyright (C) 2008 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Error: /stackunderflow in --forall--
Operand stack:
--nostringval--
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1905 1 3 %oparray_pop 1904 1 3 %oparray_pop 1888 1 3 %oparray_pop 1771 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- 0.238095 0.047619 0.952381 --nostringval-- %for_real_continue 68.5714 17.1429 360.048 --nostringval-- %for_real_continue --nostringval--
Dictionary stack:
--dict:1151/1684(ro)(G)-- --dict:0/20(G)-- --dict:121/200(L)-- --dict:13/20(L)-- --dict:1/2(L)--
Current allocation mode is local
Last OS error: 2
Current file position is 3241
GPL Ghostscript 8.62: Unrecoverable error, exit code 1
--nostringval--
实际是什么。
/forall { pstack()= forall } bind def
{MO matmul 0 --get-- --aload-- --pop-- proj action}Error: /stackunderflow in --forall--Operand stack: --nostringval--...
Just before the error is the final stackdump (using ==
) which tells me that I have a procedure body missing its dataset.
pstack
is a bit blunt compared to something like this
/args { dup 1 add copy -1 1 { -1 roll ==only ( ) print } for } def
/forall { 2 args (forall)= forall } bind def
()= %print a newline
=string %built-in 128-byte buffer used by = and ==
/object =string cvs print %convert object to string and print without newline
/stack { count dup 1 add copy { = } repeat pop } def % this is the code for the stack operator
66 (#) dup 0 3 index put print %m non-destructively print a "char"
pop
添加到
/stack
。]
/stackunderflow
错误,我可以使用
errordict/stackunderflow{dup == /stackunderflow signalerror}put
forall
。要了解后记的这个相当神秘的方面,请阅读
errordict
stop
和
stopped
。并以交互方式看一下
errordict{exch =only ==}forall
。 ghostscript中的
signalerror
在Adobe解释器中称为
.error
。它的工作是获取堆栈的快照,然后调用
stop
弹出执行堆栈。因此,此处的
dup ==
和上面的
pstack
本质上是错误的相同“时刻”,位于
stop
之前。您的交互式会话(以及之前处于gs正常模式下的程序)在exec堆栈中用
//your-program stopped { handleerror } if
括起来更深的括号。
handleerror
使用快照(以其他方式清除程序后)以错误的堆栈打印输出来打印错误报告。
handleerror
的替代品,您可以在错误程序的开头
(ehandle.ps)run
来生成不同样式的错误报告。
$error
词典中,包括堆栈的快照。
GS>[ 1 2 3 ] [4 5 6] bogus
Error: /undefined in bogus
Operand stack:
--nostringval-- --nostringval--
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- %loop_continue --nostringval-- --nostringval-- false 1 %stopped_push .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval--
Dictionary stack:
--dict:1168/1684(ro)(G)-- --dict:0/20(G)-- --dict:77/200(L)--
Current allocation mode is local
Current file position is 24
GS<2>
GS<2>$error{pop ==}forall
/dstack
/recordstacks
/globalmode
/newerror
/.nosetlocal
/estack
/errorinfo
/.inerror
/SubstituteFont
/position
/binary
/ostack
/command
/errorname
GS<2>$error/ostack get ==
[[1 2 3] [4 5 6]]
GS<2>
$error
在那里可以窥见。不要尝试以下操作:
$error ===
。 TMI。
$error
获得的非常有用的信息是
/estack
的精美印刷品,即错误点处执行堆栈的副本。
PS<3>$error /estack get ==
[ --quit--{ pop --quit--} false { quitflag false --def---dict- /
execdepth 2 --copy----get--1 --sub----put----end---dict- /doclose false
--put--interrupt } --loop----cvx--[ /quitflag false --def---dict- /
newerror false --put--/prompt --load----stopped--{ (
Error during prompt execution
)--print--handleerror --exit--} --if--{
mark /stmtfile (%statementedit)(r)--file----def--} --stopped--{ --
cleartomark---dict- /newerror --get--{ -dict- /errorname --get--/
undefinedfilename --ne--{ handleerror } --if---dict- /newerror false --
put----exit--} --if--} { --pop--stmtfile --end--{ --cvx----exec--} --
stopped---dict- --begin--{ handleerror stmtfile --closefile--} --if--}
--ifelse--checkquit ] { checkquit } { -dict- --begin--{ handleerror
stmtfile --closefile--} --if--} false -file- -file- -file- --repeat----
cvx--[ randcurve randwidth randcolor stroke ] 1 { flushpage newpath } {
newpath } --forall----cvx--[ dup length 2 gt { [ currentcolordict DEVICE
/nativecolorspace get get exec counttomark 2 add -1 roll DEVICE dup /
FillPoly get exec pop pstack ()= flushpage } { pop } ifelse ] [ ] { pop
pstack ()= flushpage } { x_max width 0.50 add def (
intersect polygon edges with scanlines)= /P poly poly length 1 sub get
def [ poly { Q exch def x_max miny floor cvi 0.50 add 1 maxy ceiling cvi
0.50 sub { 1 index exch -0.50 1 index 4 2 roll P aload pop Q aload pop
.intersect { 2 array astore exch } if } for pop /P Q def } forall ] (
sort scanline intersection list)= dup { 1 index 1 get 1 index 1 get eq
{ exch 0 get exch 0 get lt } { exch 1 get exch 1 get lt } ifelse } qsort
(set pixels on each scanline)= aload length 2 idiv { exch aload pop 3 2
roll aload pop /USEDRAWLINE where { pop r g b 7 3 roll currentdict
DrawLine } { pop 3 2 roll exch 1 exch dup width ge { pop width 1 sub }
if { r g b 4 3 roll 2 index currentdict PutPix } for pop } ifelse }
repeat end } --forall----cvx--[ aload pop .maxmin ] [ [ 16 154 ] [ 16
154 ] ] { pop .maxmin } ]
PS<3>
/command
并没有完成
/errorname
,那么接下来的代码片段。那个小的后记片段可以帮助您找到问题所在的源。在上述情况下,无论错误是什么,我都需要在源中搜索以
.maxmin
开头,以
pop
开头,..开头的调用。
executive
以获得提示
executive
并按回车几次。键入时,它可能不会回显
executive
的字母。不要害怕,但要正确拼写。它应该给您打招呼和提示。
(yourfile)run
,并且在出现错误后仍应获得提示,从而可以如上所述检查$ error。
executive
。这增加了错误处理的额外级别(exec堆栈上的另一个
stopped {handlerror} if
)。这可能有助于寻找更多奇怪的错误。
关于debugging - 调试PostScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12379122/
Debug.Assert/Debug.Fail 是否自动条件编译#if "DEBUG"?或者它是否更像是没有附加调试器(即使在发行版中)它什么也做不了?如果是这样,将它们留在您的代码中是否会对性能产生
我有一个应用程序,我配置了多个路由,一切正常,直到我配置的最新路由不起作用(显示错误的屏幕)。 我的问题是如何进行调试?没有打印错误日志,我无法找到如何获取有关正在发生的事情的更多日志。我也不知道从哪
我正在 Intellij 中调试代码。我使用 maven 来构建项目,并且在本地 .m2 存储库中有该项目的各种版本。当我开始调试时,Intellij 继续从项目的前一个快照中选择旧版本的代码。如何让
我喜欢在业余时间进行一些 TiVo 黑客事件 - TiVo 使用 Linux 变体和 TCL 。我想在我的 Windows 笔记本电脑上编写 TCL 脚本,测试它们,然后将它们通过 FTP 传输到我的
我有 ASM 代码,它使用循环语法打印 abc 。这是我的代码 ;abc.com .model small .code org 100h start: mov ah, 02h mov
我在 Debugging .net 2.0 Applications 中看到了以下代码 [Conditional("DEBUG")] void AssertTableExists() { #i
在大型项目中哪个更好用,为什么: #if DEBUG public void SetPrivateValue(int value) { ... } #endif 或 [System.D
我似乎无法让调试器运行。调试运行图标变灰,菜单选项丢失。 这只是main的情况,我可以很好地调试单元测试。 类似的问题提到了项目结构,但我看不出有什么不对: $GOPATH/src/foo.bar.c
只是想知道我的浏览器一直询问我是否想在每次点击浏览器链接刷新时停止调试非常烦人,因为这会减慢开发时间。 有没有其他人遇到过这个? 干杯 最佳答案 更新的答案,现在找到根本原因 经过两年看到这个错误时断
我正在尝试包含调试/发布相关编译器标志,例如: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x -Wall -DUSE_BOOST") set
当我尝试使用 debug.phonegap.com 调试我的phonegap 应用程序时遇到问题。 我把这个视频放在 HTML 文档的头部 在启动应用程序之前,我从 build.phonegap.
GDB 7.0以后,支持反向调试。 生成核心转储时,我可以使用反向调试命令吗? 我怎样才能做到这一点? 最佳答案 你不能。核心文件是某个时间点程序状态的快照。要在该状态下向后移动,您需要程序状态的较早
首先:如果之前有人问过这个问题,我很抱歉。我是一个熟练的谷歌用户,但这确实让我难住了,我找不到任何东西。 我目前正在编写一个小型库,我想对其进行调试。我还希望能够完全关闭调试,并且编译后的代码不应包含
我想在 tomcat 中将级别日志记录设置为 DEBUG,但在控制台中仍然只有 INFO 和 WARN 输出。谁能告诉我哪里出了问题? 我的 C:\tomcat\logging.properties:
我已经开始像这样使用定义类了: internal sealed class Defines { /// /// This constant is set to true iff th
在使用编译器指令时,我不清楚以下两个代码片段中哪一个是正确/首选的,以及为什么。似乎我见过的大多数开发人员和开源项目都使用第一种,但我也看到第二种也经常使用。 #ifdef DEBUG [self d
我遇到错误,无法完成构建。我搜索了 Stackoverflow 和 Github。我已经尝试了很多方法,但我无法修复。请帮忙。 (1) 在 [src/nullnull/debug, src/debug
我刚刚意识到,使用 TFS 部署时,DEBUG 处理器指令仍然有效,有没有办法更改 TFS/Azure 网站或构建定义中的设置,而不是在本地解决方案配置? 我仍然希望本地解决方案保持调试状态,只有部署
我有一段代码在 VS2008,C++ 中以 Debug模式运行。 问题是,当我逐行调试代码时,在代码的一个非常奇怪的地方,它崩溃并说: debug assertion faild. Expressio
我有一个简单的 Xamarin.Forms 项目,我在 Visual Studio 中运行,使用 iphone 模拟器。我在 App.cs 中有以下代码: protected override voi
我是一名优秀的程序员,十分优秀!