Håk*_*and 5 debugging perl tk-toolkit
我现在正在尝试调试Tk程序一段时间。问题似乎是deiconify()来自顶级窗口的调用,但是我无法找到deiconify()定义子的源文件。这是一个虚构的例子,只是为了说明我的意思:
测试.pl:
use strict;
use warnings;
use Tk;
my $mw = MainWindow->new( -title => "Main Window" );
$mw->Label(-text => "Debugging", -font => "Times 20")->pack( );
$mw->Button(
-text => 'Quit',
-command => sub { exit },
)->pack;
$mw->Button(
-text => 'Show window',
-command => \&show_window,
)->pack;
my $tl = $mw->Toplevel( -title => "Toplevel 1" );
$tl->Button(
-text => 'Quit',
-command => sub { exit },
)->pack;
$tl->withdraw();
MainLoop;
sub show_window {
#$DB::single = 1;
$tl->deiconify(); # <--- Where is this sub defined??
$tl->raise();
}
Run Code Online (Sandbox Code Playgroud)
我首先尝试 grep 子名称1的发行版:
find . -name '*.pm' -exec grep -Hn deiconify {} \;find . -name '*.xs' -exec grep -Hn deiconify {} \;find . -name '*.al' -exec grep -Hn deiconify {} \;find . -name '*.h' -exec grep -Hn deiconify {} \;然后我尝试在调试器下运行脚本
perl -d test.pl
Run Code Online (Sandbox Code Playgroud)
并在调用之前设置断点$tl->deiconify()(见上文)。当我按下s断点时
DB<1> s
Tk::Submethods::CODE(0x56245540c658)(/home/hakon/perlbrew/perls/perl-5.24.1/lib/site_perl/5.24.1/x86_64-linux/Tk/Submethods.pm:37):
37: *{$package.'::'.$sub} = sub { shift->$fn($sub,@_) };
Run Code Online (Sandbox Code Playgroud)
它显示了deiconify()被定义为匿名子例程的行( 的第 37 行Tk::Submethods),但是当我s再次按进入匿名子例程时,它只是跳过它并返回到 中的第 32 行test.pl。
我怀疑该方法必须以某种方式定义Tk::wm(因为它与窗口管理器相关),也许是通过自动加载机制或通过dynaloader?
脚注
1. 命令是从 Tk 发行版的顶级目录运行的。要进行设置,请先运行以下命令:
cpan -g Tk
tar zxvf Tk-804.033.tar.gz
cd Tk-804.033
Run Code Online (Sandbox Code Playgroud)
更自由地抓取源代码(特别是包括文件)可以在 file 中*.c找到字符串。它位于介绍 C 函数的注释中,看起来确实是该功能的实际实现。This procedure is invoked to process the "wm deiconify" Tcl commandpTk/mTk/win/tkWinWm.cWmDeiconifyCmd
我没有费心去研究 Tk 模块 XS 代码如何将 C 函数暴露给 Perl 级别,但如果这是您真正感兴趣的,那么您现在知道端点,只需填写中间即可:- )
一旦该函数暴露于 Perl 级别,Tk::Submethods您上面引用的行显然就是它被注入到适当符号表中的位置,以便可以通过 调用它$tl->deiconify()。
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |