Я следовал в этом посте и в этой презентации и придумал следующий набор команд gdb для OSX с исполняемым файлом x86-64, который можно загрузить с опцией -x
, когда присоединение к процессу:
set $s = dyld_stub_rand
set $p = ($s+6+*(int*)($s+2))
call (void*)dlsym((void*)dlopen("myrand.dylib"), "my_rand")
set *(void**)$p = my_rand
c
Магия в команде set $p = ...
. dyld_stub_rand
- это 6-байтовая инструкция перехода. Смещение перехода составляет dyld_stub_rand+2
(4 байта). Это $rip
-относительный переход, поэтому добавьте смещение к тому, что было бы $rip
в этой точке (сразу после инструкции, dyld_stub_rand+6
).
Это указывает на запись таблицы символов, которая должна быть либо реальной rand
, либо подпрограммой динамического компоновщика для ее загрузки (если она никогда не вызывалась). Затем он заменяется на my_rand
.
Иногда GDB извлекает dyld_stub_rand
из libSystem или другой разделяемой библиотеки, если это происходит, сначала выгрузите их с помощью remove-symbol-file
перед выполнением других команд.
Это будет переводить.
public static IQueryable<NewsItemSummary> WithID(
this IQueryable<NewsItemSummary> qry,
List<Guid> Ids
)
{
return from newsItemSummary in qry
where Ids.Contains(newsItemSummary.ID)
select newsItemSummary;
}
)
Перевод метода Contains для локальных коллекций был одной из последних функций, добавленных при разработке linq для sql для .net 3.5, поэтому в некоторых случаях вы ожидаете работы, которая этого не делает - например, перевод IList
.
Также имейте в виду, что хотя LinqToSql с радостью переводит списки, содержащие огромное количество элементов (я видел это выполняют более 50 000 элементов), SQL Server будет принимать только 2100 параметров для одного запроса.