В целом невозможно сделать. Вот один особенно противный случай:
struct Point2d {
int x;
int y;
};
struct Point3d {
int x;
int y;
int z;
};
void dump(Point3 *p)
{
printf("[%d %d %d]\n", p->x, p->y, p->z);
}
Point2d points[2] = { {0, 1}, {2, 3} };
Point3d *p3 = reinterpret_cast<Point3d *>(&points[0]);
dump(p3);
На многих платформах, это распечатает:
[0 1 2]
Вы вынуждаете систему во время выполнения неправильно интерпретировать биты памяти, но в этом случае она не собирается отказывать, потому что биты все имеют смысл. Это - часть дизайна языка (взгляд на полиморфизм C-стиля с struct inaddr
, inaddr_in
, inaddr_in6
), таким образом, Вы не можете надежно защитить от него ни на какой платформе.
Не добавляйте .dll, попробуйте просто .loadby sos mscorwks
Если у вас есть каталог .NET framework (например, c: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727) на вашем пути, вы можете просто использовать
.load sos
У меня тоже была эта проблема, и она оказалась из-за того, что отладчик взламывал приложение до загрузки CLR. Мне пришлось позволить приложению работать дальше, прежде чем я смог что-либо сделать.
Выполнение этого в windbg может помочь:
sxe ld:mscorlib
g
(... breaks again ...)
.loadby sos mscorwks
'sxe ld: ..' останавливается при загрузке модуля.
Как упоминает Сиксто, если вы отлаживаете приложения dotnet 4, вам необходимо заменить последнюю строку на
.loadby sos clr