Scripts discussion (2)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:Не удается инициализировать приложение для отладки.
Инструкция по установке MS Script Editor. Требуется дистрибутив MS Office.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor
У меня оказался уже установлен некий Microsoft Script Editor 10.0 (и MS Office 2003), но там все по-другому.
Но статья натолкнула на С:\Program Files\Common Files\Microsoft Shared\VS7Debug\VS7JIT.EXE, я это дело потыкал, оно ругнулось на
JIT Debugging
---------------------------
JIT Debugging is disabled.

To enable JIT Debugging, from Visual Studio .NET go to Tools/Options/Debugging/JIT Settings.
---------------------------
ОК
Visual Studio .NET у меня в принципе-то есть, но на эту систему я ее никогда не ставил. :)
Я нагуглил HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings\JITDebug, выставил там 1.

Теперь из Script Editor можно прицепиться к процессу. Изначально тоже можно было, но безрезультатно. И потом надо выбрать Debug – Break All.
В общем, оно открывает работающий скрипт, можно выполнять его пошагово, но в момент падения ничего не происходит.

Падает где-то тут:

Code: Select all

		statusbar.restore();
		if(lpFrame2) {
(галочку в списке скриптов пока что больше не проверял)

Upd:
Падает вот тут:

Code: Select all

function Statusbar() {
	...
	this.get = function() {
		return buffer(function(lpTextBuffer) {
			AkelPad.SendMessage(hWndStatus, _TSTR ? 1037 /*SB_GETTEXTW*/ : 1026 /*SB_GETTEXTA*/, nParts - 1, lpTextBuffer); // <---
			return AkelPad.MemRead(lpTextBuffer, _TSTR);
		});
	};
Upd #2:
Однако, если закомментировать statusbar.restore();, то все равно иногда падает. :shock:
И падает уже на

Code: Select all

			tileTabs(lpFrame, lpFrame2, tileHorizontal, useTabsOrder);
Upd #3:
А с галочкой в самом плагине по-прежнему глухо, «Не удается инициализировать приложение для отладки».

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher
У меня Office XP, но Script Editor также 10.0. Находится "c:\Program Files\Microsoft Office\Office10\MSE7.EXE". Я бы "HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings\JITDebug" вернул на 0 (по крайней мере у меня стоит 0). И надо включить через меню "Debug" в Script Editor'е "Web Debugging". Это насколько вижу и есть включение JIT, отладка в реальном времени.
Last edited by Instructor on Fri Apr 04, 2014 6:02 pm, edited 2 times in total.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor
У меня вот такая версия.
Вернул в реестре как было – перестало работать вообще.
И в меню такого нет.
Плюс у меня IE9, там уже встроенный отладчик (и пунктов меню как в статье соответственно тоже нет).
Last edited by Infocatcher on Fri Apr 04, 2014 6:03 pm, edited 2 times in total.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Можно еще галочки проверить:

Image

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:Находится "c:\Program Files\Microsoft Office\Office10\MSE7.EXE".
Ну да, с "c:\Program Files\Microsoft Office\OFFICE11\MSE7.EXE" я и работал.

А галочки такие же, да.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

В общем, что-то ведь у меня заработало.
Но, я так понимаю, не видать значения переменных из текущей области видимости. Или и не должно? Странный тогда отладчик. :)
И в момент падения курсор просто остается на той строке, где произошло падение – никакой дополнительной информации не видно.

P.S. На всякий случай: в моем изначальном сообщении есть несколько дополнений.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

После всяких галко нажатий и "vs7jit.exe -RegServer" "vs7jit.exe -UnRegServer" у меня JITDebug стало 1 :)
Infocatcher wrote:Но, я так понимаю, не видать значения переменных из текущей области видимости. Или и не должно?
Должно. Debug -> Windows -> Locals

Можно еще проверить записи реестра (Office10 <-> Office11).

Code: Select all

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{000C1217-0000-0000-C000-000000000046}\LocalServer32]
@="C:\\Program Files\\Microsoft Office\\Office10\\MSE7.EXE /JITDebug"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Machine Debug Manager\JITDebugging\Engines\{F200A7E7-DEA5-11D0-B854-00A0244A1DE2}]
@="Script Only"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Machine Debug Manager\JITDebugging\Engines\{F200A7E7-DEA5-11D0-B854-00A0244A1DE2}\{000C1217-0000-0000-C000-000000000046}]
@=""
"Remote"=dword:00000001
Возможно и это:

Code: Select all

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AD7Metrics\Engine\{F200A7E7-DEA5-11D0-B854-00A0244A1DE2}]
"Name"="Script"
"CLSID"="{56B4E602-21A1-11D2-8FD6-00C04FA30000}"
"AlwaysLoadLocal"=dword:00000001
"Attach"=dword:00000001
"ConditionalBP"=dword:00000001
"FunctionBP"=dword:00000001
"HitCountBP"=dword:00000001
"JITDebug"=dword:00000001
"PortSupplier"="{708C1ECA-FF48-11D2-904F-00C04FA302A1}"
"SetNextStatement"=dword:00000001
"SuspendThread"=dword:00000001

[HKEY_CLASSES_ROOT\CLSID\{56B4E602-21A1-11D2-8FD6-00C04FA30000}]
@="Script LE"

[HKEY_CLASSES_ROOT\CLSID\{56B4E602-21A1-11D2-8FD6-00C04FA30000}\InprocServer32]
@="C:\\Program Files\\Microsoft Office\\Office10\\VS Runtime\\scriptle2.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{56B4E602-21A1-11D2-8FD6-00C04FA30000}\ProgID]
@="ScriptDebugEngine.7"

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:Должно. Debug -> Windows -> Locals
Ой, и правда. Пропустил как-то. :)

Сейчас проверил еще раз – снова дошло до

Code: Select all

			AkelPad.SendMessage(hWndStatus, _TSTR ? 1037 /*SB_GETTEXTW*/ : 1026 /*SB_GETTEXTA*/, nParts - 1, lpTextBuffer);
lpTextBuffer 64674088 Number
Подробностей я так и не вижу. В стеке вызовов – только анонимные js-функции, которые я и так пошагово прошел.
И висит окошко
[Window Title]
AkelPad (x86) text editor

[Main Instruction]
Программа "AkelPad (x86) text editor" не работает

[Content]
Возникшая проблема привела к прекращению работы программы. Windows закроет эту программу, а если есть известный способ устранения проблемы, уведомит вас об этом.

[Закрыть программу]
Если его закрыть, то AkelPad закроется и документ с кодом скрипта из отладчика пропадет.


По ключам есть вот такое:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{000C1227-0000-0000-C000-000000000046}\LocalServer32]
@="C:\\Program Files\\Microsoft Office\\OFFICE11\\MSE7.EXE /JITDebug"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Machine Debug Manager\JITDebugging\Engines\{F200A7E7-DEA5-11D0-B854-00A0244A1DE2}]
@="Script Only"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Machine Debug Manager\JITDebugging\Engines\{F200A7E7-DEA5-11D0-B854-00A0244A1DE2}\{000C1227-0000-0000-C000-000000000046}]
@=""
"Remote"=dword:00000001

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher
Что, если сделать переменную lpTextBuffer глобальной?

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:Возможно и это
Кажется, все то же самое, только OFFICE11 в пути про InprocServer32.
Instructor wrote:Что, если сделать переменную lpTextBuffer глобальной?

Code: Select all

var lpTextBuffer;
function Statusbar() {
	this.get = this.set = this.save = this.restore = function() {};

	// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=13656#p13656
	var hWndStatus = oSys.Call("user32::GetDlgItem", hMainWnd, 10002 /*ID_STATUS*/);
	if(!hWndStatus || !oSys.Call("user32::IsWindowVisible", hWndStatus))
		return;
	var nParts = AkelPad.SendMessage(hWndStatus, 1030 /*SB_GETPARTS*/, 0, 0);
	if(nParts <= 5)
		return;
	var _origStatus, _customStatus;
	var _this = this;
	function buffer(callback) {
		/*var */lpTextBuffer = AkelPad.MemAlloc(1024 * _TSIZE);
		if(lpTextBuffer) {
			var ret = callback.call(_this, lpTextBuffer);
			AkelPad.MemFree(lpTextBuffer);
			return ret;
		}
		return undefined;
	}
	this.get = function() {
		return buffer(function(/*lpTextBuffer*/) {
			AkelPad.SendMessage(hWndStatus, _TSTR ? 1037 /*SB_GETTEXTW*/ : 1026 /*SB_GETTEXTA*/, nParts - 1, lpTextBuffer);
			return AkelPad.MemRead(lpTextBuffer, _TSTR);
		});
	};
	this.set = function(pStatusText) {
		buffer(function(/*lpTextBuffer*/) {
			_customStatus = pStatusText;
			AkelPad.MemCopy(lpTextBuffer, pStatusText, _TSTR);
			AkelPad.SendMessage(hWndStatus, _TSTR ? 1035 /*SB_SETTEXTW*/ : 1025 /*SB_SETTEXTA*/, nParts - 1, lpTextBuffer);
		});
	};
	this.save = function() {
		_origStatus = this.get();
	};
	this.restore = function() {
		if(_origStatus != undefined && this.get() == _customStatus)
			this.set(_origStatus);
	};
}

Все равно периодически падает.
Причем, кажется, чаще падает после открытия новой вкладки, чем после выбора существующей.

Упало в том же месте, на

Code: Select all

AkelPad.SendMessage(hWndStatus, _TSTR ? 1037 /*SB_GETTEXTW*/ : 1026 /*SB_GETTEXTA*/, nParts - 1, lpTextBuffer);
Только теперь lpTextBuffer в locals не показывается... Но раз падает не каждый раз, то с ним должно бы быть все в порядке. :?

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Уточню, что под глобальной подразумевалось - всю строку в начало скрипта

Code: Select all

var oSys = AkelPad.SystemFunction();
var lpTextBuffer = AkelPad.MemAlloc(1024 * _TSIZE);
А "AkelPad.MemFree(lpTextBuffer);" на время тестов можно закомментировать.

Добавлено:
Еще попытка разобраться с JIT'ом. GUID используемые Scripts плагином:
Scripts source wrote:#ifdef _WIN64
//{56B9FC1C-63A9-4CC1-AC21-087D69A17FAB}
DEFINE_GUID(IID_IProcessDebugManager, 0x56b9fc1c, 0x63a9, 0x4cc1, 0xac, 0x21, 0x08, 0x7d, 0x69, 0xa1, 0x7f, 0xab);
#else
//{51973C2f-CB0C-11d0-B5C9-00A0244A0E7A}
DEFINE_GUID(IID_IProcessDebugManager, 0x51973C2f, 0xCB0C, 0x11d0, 0xb5, 0xc9, 0x00, 0xa0, 0x24, 0x4a, 0x0e, 0x7a);
#endif

//{78A51822-51F4-11D0-8F20-00805F2CD064}
DEFINE_GUID(CLSID_ProcessDebugManager, 0x78a51822, 0x51f4, 0x11d0, 0x8f, 0x20, 0x0, 0x80, 0x5f, 0x2c, 0xd0, 0x64);
На WinXP x86:

Code: Select all

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{78A51822-51F4-11D0-8F20-00805F2CD064}]
@="ProcessDebugManager Class"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{78A51822-51F4-11D0-8F20-00805F2CD064}\InprocServer32]
@="D:\\Program Files\\Common Files\\Microsoft Shared\\VS7Debug\\pdm.dll"
"ThreadingModel"="Both"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{78A51822-51F4-11D0-8F20-00805F2CD064}\ProgID]
@="ProcessDebugManager.7"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{78A51822-51F4-11D0-8F20-00805F2CD064}\VersionIndependentProgID]
@="ProcessDebugManger"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ProcessDebugManager.7\CLSID]
@="{78A51822-51F4-11D0-8F20-00805F2CD064}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ProcessDebugManager\CLSID]
@="{78A51822-51F4-11D0-8F20-00805F2CD064}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{51973C2F-CB0C-11D0-B5C9-00A0244A0E7A}]
@="IProcessDebugManager"

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor
Стало

Code: Select all

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var lpTextBuffer = AkelPad.MemAlloc(1024 * _TSIZE); //~

...

function Statusbar() {
	this.get = this.set = this.save = this.restore = function() {};

	// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=13656#p13656
	var hWndStatus = oSys.Call("user32::GetDlgItem", hMainWnd, 10002 /*ID_STATUS*/);
	if(!hWndStatus || !oSys.Call("user32::IsWindowVisible", hWndStatus))
		return;
	var nParts = AkelPad.SendMessage(hWndStatus, 1030 /*SB_GETPARTS*/, 0, 0);
	if(nParts <= 5)
		return;
	var _origStatus, _customStatus;
	var _this = this;
	function buffer(callback) {
		//var lpTextBuffer = AkelPad.MemAlloc(1024 * _TSIZE);
		if(lpTextBuffer) {
			var ret = callback.call(_this, lpTextBuffer);
			//~ AkelPad.MemFree(lpTextBuffer);
			return ret;
		}
		return undefined;
	}
	this.get = function() {
		return buffer(function(/*lpTextBuffer*/) {
			AkelPad.SendMessage(hWndStatus, _TSTR ? 1037 /*SB_GETTEXTW*/ : 1026 /*SB_GETTEXTA*/, nParts - 1, lpTextBuffer);
			return AkelPad.MemRead(lpTextBuffer, _TSTR);
		});
	};
	this.set = function(pStatusText) {
		buffer(function(/*lpTextBuffer*/) {
			_customStatus = pStatusText;
			AkelPad.MemCopy(lpTextBuffer, pStatusText, _TSTR);
			AkelPad.SendMessage(hWndStatus, _TSTR ? 1035 /*SB_SETTEXTW*/ : 1025 /*SB_SETTEXTA*/, nParts - 1, lpTextBuffer);
		});
	};
	this.save = function() {
		_origStatus = this.get();
	};
	this.restore = function() {
		if(_origStatus != undefined && this.get() == _customStatus)
			this.set(_origStatus);
	};
}
, упало точно там же...
Меня другое смущает:
Я wrote:Однако, если закомментировать statusbar.restore();, то все равно иногда падает.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

На WinXP x86:
Все, кроме вот этого

Code: Select all

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{51973C2F-CB0C-11D0-B5C9-00A0244A0E7A}]
@="IProcessDebugManager"
у меня в наличии. :?

Upd:
А поиск по «DebugManager» в «HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface» находит только

Code: Select all

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{51973C2C-CB0C-11D0-B5C9-00A0244A0E7A}	(По умолчанию)	IMachineDebugManager
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{51973C2D-CB0C-11D0-B5C9-00A0244A0E7A}	(По умолчанию)	IMachineDebugManagerCookie
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{51973C2E-CB0C-11D0-B5C9-00A0244A0E7A}	(По умолчанию)	IMachineDebugManagerEvents
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{C980E8E2-5DD3-4310-868F-59AF24A92327}	(По умолчанию)	IMachineDebugManagerCookieEx
.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Infocatcher wrote:Меня другое смущает:
Я wrote:Однако, если закомментировать statusbar.restore();, то все равно иногда падает.
И падает снова при отправке сообщения:

Code: Select all

	var hWndMdi  = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, lpFrame);
Более того, я воткнул перед этим вызовом

Code: Select all

	var test = AkelPad.SendMessage(hMainWnd, 1319 /*AKD_UNIQUEID*/, 0, 0);
И на нем тоже упало, хотя это сообщение на используемой версии AkelPad'а не должно обрабатываться.

Upd:
Хоть какая-то польза: исправил утечку памяти. Падать, впрочем, не перестало. Я даже на всякий случай проверил без

Code: Select all

CmdLineBegin=/Call("Scripts::Main", 1, "autoSaveSession.js", "-debug=false")
Locked