команды должны быть в одной строке удалить разрыв строки в Where (), если вы копируете вставить
0:057> dx -r1 @$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).Where
( ( p=>p.ToDisplayString().Contains("Wait") == true ))
результат команды
@$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).
Where( ( p=>p.ToDisplayString().Contains("Wait") == true ))
[0x9dc] : ntdll!NtWaitForMultipleObjects + 0xc [Switch To]
[0x480] : ntdll!NtWaitForMultipleObjects + 0xc [Switch To]
[0xc4] : ntdll!NtWaitForMultipleObjects + 0xc [Switch To]
[0xae8] : ntdll!NtWaitForSingleObject + 0xc [Switch To]
[0xeac] : ntdll!NtWaitForKeyedEvent + 0xc [Switch To]
[0xf08] : ntdll!NtWaitForMultipleObjects + 0xc [Switch To]
[0xdd4] : ntdll!NtWaitForSingleObject + 0xc [Switch To]
[0xc64] : ntdll!NtWaitForSingleObject + 0xc [Switch To]
[0x89c] : ntdll!NtWaitForKeyedEvent + 0xc [Switch To]
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[0x162c] : ntdll!NtWaitForKeyedEvent + 0xc [Switch To]
команда для ложного условия снова должна быть одинарной line
0:057> dx -r1 @$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).Where
( ( p=>p.ToDisplayString().Contains("Wait") == false ))
result
@$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).
Where( ( p=>p.ToDisplayString().Contains("Wait") == false ))
[0x208] : ntdll!NtRemoveIoCompletion + 0xc [Switch To]
[0x3ec] : ntdll!NtRemoveIoCompletion + 0xc [Switch To]
[0xadc] : user32!NtUserGetMessage + 0xc [Switch To]
[0x1794] : ntdll!NtDelayExecution + 0xc [Switch To]
[0xe78] : ntdll!NtRemoveIoCompletion + 0xc [Switch To]
[0x1164] : ntdll!DbgUiRemoteBreakin + 0x3c [Switch To]
сравнение вывода между! busy от pde, как это было предложено командой Lieven, со встроенной командой, слегка измененной для исключения стеков «RemoveIo» и «Wait» [1110 ]
0:037> dx @$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).Where(
(p=>p.ToDisplayString().Contains("Wait") != true)).Where(p=>p.ToDisplayString().
Contains("Remove") != true)
результаты
@$curprocess.Threads.Select(p=>p.Stack).Select(p=>p.Frames).Select(t=>t[1]).
Where( (p=>p.ToDisplayString().Contains("Wait") !=
true)).Where(p=>p.ToDisplayString().Contains("Remove") != true)
[0xd78] : user32!NtUserGetMessage + 0xc [Switch To]
[0xe44] : user32!NtUserGetMessage + 0xc [Switch To]
[0x514] : ntdll!DbgUiRemoteBreakin + 0x3c [Switch To]
0:037> !busy
# 37 TID:0d78 kb kbn kbnL kn knL kpn kPn
# ChildEBP RetAddr
00 1737fdd8 770ccde0 ntdll!KiFastSystemCallRet
01 1737fddc 770cce13 user32!NtUserGetMessage+0xc
xxxx
0b 1737ff24 00000000 ntdll!_RtlUserThreadStart+0x1b
50 TID:0e44 kb kbn kbnL kn knL kpn kPn
# ChildEBP RetAddr
00 1fb8fa18 770ccde0 ntdll!KiFastSystemCallRet
01 1fb8fa1c 770c18d9 user32!NtUserGetMessage+0xc
xxxxxx
07 1fb8fb20 00000000 ntdll!_RtlUserThreadStart+0x1b
53 TID:0514 kb kbn kbnL kn knL kpn kPn
# ChildEBP RetAddr
00 144cf778 7780f20f ntdll!DbgBreakPoint
01 144cf7a8 7748ed6c ntdll!DbgUiRemoteBreakin+0x3c
xxxxxxx
05 144cf848 00000000 ntdll!_RtlUserThreadStart+0x1b
Threads: 3 of 54
Frames : 1
Command: knL
Mode : Basic
Я склонен добавлять "_recurse" в конец. Так "reverse_recurse". Не уверенный, где я получил это от. Мне нравится оставлять основную функцию случая простой, как Вы имеете в своем примере. Это имеет тенденцию быть "общедоступной" функцией и тем, что это использует функцию помощника для выполнения, повторение не важно вызывающей стороне. В JavaScript я иногда иду, насколько скрыть повторяющуюся функцию через закрытие, заставить его действительно очистить его не означает быть назван непосредственно.
Можно вызвать функцию помощника что-либо, что Вы хотите, и она не будет иметь значения, пока Вы не помещаете функцию помощника в "глобальное" пространство имен. Просто добавление "начала" кажется обычной практикой.:) Например, в Haskell,
reverse :: [a] -> [a]
reverse = reverse' []
where reverse' :: [a] -> [a] -> [a]
reverse' result [] = result
reverse' result (x:xs) = reverse' (x:result) xs
Я всегда использую, делают _, как "do_compute" с "вычисляют". Я нахожу это довольно описательным, поскольку это - эффективно часть функции, которая выполняет действие, тогда как "вычисление", которое получает названные потребности иметь простое описательное имя для внешнего мира.
Я соглашаюсь с ShreevatsaR, если Вы не делаете верхний уровень функции помощника (или хуже, поместите его в список экспорта), чем не имеет значения, каково его имя. Я склонен вызывать функции помощника f
и g
.
reverse :: [a] -> [a]
reverse = f []
where
f ys [] = xs
f ys (x:xs) = f (x:ys) xs
Я просто использую эту схему именования для небольших функций (иначе, я не знаю что f
относится к). С другой стороны, почему Вы когда-либо писали бы большие функции?
Однако, если Вы действительно захотите экспортировать свою функцию 'помощника', потому что это могло бы быть полезно для других, я назову его:
reverseAccumulator
Как Haskell zip
и zipWith
. Но я не вызвал бы те функции 'помощника', zipWith
просто родовая функция и zip
реализация по умолчанию (вероятно, тот, который это использовало большинство).
Я также соглашаюсь с ShreevatsaR, в этом примере я сделал бы помощника закрытой функцией.
Для других случаев, где мне нужны функции помощника, чтобы быть видимым в целом модуле, но не экспортируемый, я склонен снабжать префиксом функции '_'. Несомненно, существует явный оператор экспорта, но во время разработки я склонен экспортировать все функции для упрощения интерактивного исследования, например, в ghci. Позже я добавляю список экспортируемых функций, и underbar помогает помнить, предназначил ли я функцию, чтобы быть локальным или нет.
Я использую aux
или foo_aux
(для основной функции foo
), и вкладывают определение, таким образом, это не внешне видимо.
установите и выполнитесь
пример:
function whateverSetup() { ... }
function whateverExecute() { ... }