Я подозреваю, что ответ, вероятно, "нет", но на всякий случай, есть ли способ добавить данные в отслеживаемое событие при использовании return_trace ()?
Например,
1> erlang:trace(all, true, [call]).
...
2> MatchSpec = dbg:fun2ms(fun([Num1, Num2]) when Num1 < Num2 ->
return_trace(), message({event_name, neg_sub_event});
(_) ->
return_trace(), message({event_name, sub_event}) end).
...
3> erlang:trace_pattern({mod, sub, 2}, MatchSpec, [local]).
...
4> flush().
ok
5> spawn(mod, sub, [4, 5]).
...
6> flush().
Shell got {trace,<0.64.0>,call,
{mod,sub,[4,5]},
{event_name,neg_sub_event}}
Shell got {trace,<0.64.0>,return_from,{mod,sub,2},-1}
ok
7> spawn(mod, sub, [6, 5]).
...
8> flush().
Shell got {trace,<0.67.0>,call,{mod,sub,[6,5]},{event_name,sub_event}}
Shell got {trace,<0.67.0>,return_from,{mod,sub,2},1}
ok
Я только что придумал пример, не задумываясь об этом ... в этом случае я мог выяснить, является ли это neg_sub_event или sub_event из возвращаемого значения, включенного в трассировку return_from ... но дело в том, что я хотел бывключить {event_name, Name} не только при возникновении события вызова, но и при создании события return_from.
Возможно ли это даже?
Спасибо.
Редактировать
Вот почему я не могу просто получить трассировку 'return_from' и сказать "хорошо, поэтому эта трассировка" return_from "должна соответствовать последней трассе" call ", которую я получил. Поэтомуэта трассировка 'return_from' должна иметь имя_символа последней полученной трассировки 'call':
Рассмотрим 2 процесса A и B. Оба вызывают функцию F1, которая отслеживается со спецификацией, которая утверждает, что в одномсазe (например, F1 вызывается с аргументом 10), сгенерированная трассировка вызова должна иметь имя-события event_ten, а return_trace () должна быть сгенерирована после трассировки вызова.Следовательно, процесс, получающий сообщения трассировки, получит:
{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_ten}}
, когда F1 вызывается с аргументом 10, и
{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal}
, когда F1 вызывается с аргументом 10,вычисляется и возвращается.
Другая спецификация, помещенная в F1 (через спецификацию соответствия, используемую в erlang: trace_pattern / 3), заключается в том, что, например, когда F1 вызывается с аргументом 20, трассировка 'call'сгенерированный должен иметь имя-события «is_twenty», и return -trace () должен быть сгенерирован после трассировки вызова.Следовательно, процесс, получающий сообщения трассировки, получит:
{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_twenty}}
, когда F1 вызывается с аргументом 20, и
{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal}
, когда F1 вызывается с аргументом 20,вычисляется и возвращается.
Теперь, если A начинает оценивать F1 (с аргументом 10), генерирует трассировку 'call', выгружается, B начинает оценивать F1 (с аргументом 20), генерирует трассировку 'call',выгружается, A завершает оценку F1 и генерирует трассировку return_from, процесс, получающий сообщения трассировки, получит:
{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_ten}}
{trace, Pid, call, {Mod, Fun, Args}, {event_name, is_twenty}}
{trace, Pid, return_from, {Mod, Fun, Arity}, ReturnVal}
На этом этапе, если процесс, получающий сообщения трассировки, предполагает, что каждый return_from'trace message соответствует последнему полученному сообщению' call ', он назначит имя_события' is_twenty 'сообщению return_from, хотя на самом деле это должно быть' is_ten '.