Page 92 of 96
Posted: Fri Apr 04, 2014 3:47 pm
by Instructor
Infocatcher wrote: Не удается инициализировать приложение для отладки.
Инструкция по установке MS Script Editor . Требуется дистрибутив MS Office.
Posted: Fri Apr 04, 2014 5:23 pm
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();, то все равно иногда падает.
И падает уже на
Code: Select all
tileTabs(lpFrame, lpFrame2, tileHorizontal, useTabsOrder);
Upd #3:
А с галочкой в самом плагине по-прежнему глухо, «Не удается инициализировать приложение для отладки».
Posted: Fri Apr 04, 2014 5:51 pm
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, отладка в реальном времени.
Posted: Fri Apr 04, 2014 6:01 pm
by Infocatcher
Instructor
У меня
вот такая версия .
Вернул в реестре как было – перестало работать вообще.
И
в меню такого нет .
Плюс у меня IE9, там уже встроенный отладчик (и пунктов меню как в статье соответственно тоже нет).
Posted: Fri Apr 04, 2014 6:02 pm
by Instructor
Можно еще галочки проверить:
Картинка Картинка
Posted: Fri Apr 04, 2014 6:04 pm
by Infocatcher
Instructor wrote: Находится "c:\Program Files\Microsoft Office\Office10\MSE7.EXE".
Ну да, с "c:\Program Files\Microsoft Office\OFFICE
11 \MSE7.EXE" я и работал.
А галочки такие же, да.
Posted: Fri Apr 04, 2014 6:10 pm
by Infocatcher
В общем, что-то ведь у меня заработало.
Но, я так понимаю, не видать значения переменных из текущей области видимости. Или и не должно? Странный тогда отладчик.
И в момент падения курсор просто остается на той строке, где произошло падение – никакой дополнительной информации не видно.
P.S. На всякий случай: в моем
изначальном сообщении есть несколько дополнений.
Posted: Fri Apr 04, 2014 6:34 pm
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"
Posted: Fri Apr 04, 2014 6:47 pm
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\{000C122 7-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}\{000C122 7-0000-0000-C000-000000000046}]
@=""
"Remote"=dword:00000001
Posted: Fri Apr 04, 2014 6:50 pm
by Instructor
Infocatcher
Что, если сделать переменную lpTextBuffer глобальной?
Posted: Fri Apr 04, 2014 7:03 pm
by Infocatcher
Instructor wrote: Возможно и это
Кажется, все то же самое, только OFFICE1
1 в пути про 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 не показывается... Но раз падает не каждый раз, то с ним должно бы быть все в порядке.
Posted: Fri Apr 04, 2014 7:23 pm
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"
Posted: Fri Apr 04, 2014 7:45 pm
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();, то все равно иногда падает.
Posted: Fri Apr 04, 2014 7:52 pm
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
.
Posted: Fri Apr 04, 2014 10:10 pm
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")