SqlException
с ошибкой 40 означает, что вы не можете подключиться к вашему SQL Server.
Кажется, у вас неправильная конфигурация на вашем сервере или сервер не в сети.
Здесь вы можете найти подробное описание того, как выполнять шаги выше.
Ну, ограниченные по объему функцией помехи instance
переменная не обнаруживается в a .map
файл, сгенерированный cl.exe /Fm
, и это не обнаруживается, когда я использую x programname!*MyClass*
в WinDbg, таким образом, скорректированное имя, кажется, не содержит MyClass
вообще.
Опция 1: демонтировать MyClass::getInstance
Этот подход кажется легче:
0:000> uf programname!MyClass::getInstance programname!MyClass::getInstance [programname.cpp @ 14]: 14 00401050 55 push ebp 14 00401051 8bec mov ebp,esp 15 00401053 a160b34200 mov eax,dword ptr [programname!$S1 (0042b360)] 15 00401058 83e001 and eax,1 15 0040105b 7526 jne funcstat!MyClass::getInstance+0x33 (00401083) programname!MyClass::getInstance+0xd [programname.cpp @ 15]: 15 0040105d 8b0d60b34200 mov ecx,dword ptr [programname!$S1 (0042b360)] 15 00401063 83c901 or ecx,1 15 00401066 890d60b34200 mov dword ptr [programname!$S1 (0042b360)],ecx 15 0040106c b9b0be4200 mov ecx,offset programname!instance (0042beb0) 15 00401071 e88fffffff call programname!ILT+0(??0MyClassQAEXZ) (00401005) 15 00401076 68e03e4200 push offset programname!`MyClass::getInstance'::`2'::`dynamic atexit destructor for 'instance'' (00423ee0) 15 0040107b e8f3010000 call programname!atexit (00401273) 15 00401080 83c404 add esp,4 programname!MyClass::getInstance+0x33 [programname.cpp @ 16]: 16 00401083 b8b0be4200 mov eax,offset programname!instance (0042beb0) 17 00401088 5d pop ebp 17 00401089 c3 ret
От этого мы можем сказать что компилятор, названный объектом $S1
. Конечно, это имя будет зависеть от того, сколько ограниченных по объему функцией статических переменных Ваша программа имеет.
Опция 2: Поисковая память для объекта
Подробно остановиться на предложении @gbjbaanb, если MyClass
имеет виртуальные функции, Вы смогли находить его местоположение твердым путем:
x
управляйте для нахождения адреса MyClass vtable:0:000> x programname!MyClass::`vftable' 00425c64 programname!MyClass::`vftable' =
s
управляйте для поиска виртуального адресного пространства процесса (в этом примере, 0-2GB) для указателей на vtable MyClass:0:000> s -d 0 L?7fffffff 00425c64 004010dc 00425c64 c35de58b cccccccc cccccccc d\B...]......... 0040113c 00425c64 8bfc458b ccc35de5 cccccccc d\B..E...]...... 0042b360 00425c64 00000000 00000000 00000000 d\B.............
dt
управляйте, чтобы найти vtable смещение класса и вычесть это из адресов, возвращенных из поиска. Это возможные адреса для объекта.0:000> dt programname!MyClass +0x000 __VFN_table : Ptr32 +0x008 x : Int4B +0x010 y : Float
dt programname!MyClass 0042b360
исследовать членские переменные объекта, тестируя гипотезу, что объект расположен в 0042b360 (или некоторый другой адрес). Вы, вероятно, получите некоторые ложные положительные стороны, как я сделал выше, но путем осмотра членских переменных Вы можете выяснять, какой является Вашим одиночным элементом.Это - общая техника для нахождения объектов C++ и является видом излишества, когда Вы могли просто демонтировать MyClass::getInstance
.
В gdb можно поместить контрольную точку на скорректированное имя переменной.
Например, с этой функцией:
int f() {
static int xyz = 0;
++xyz;
return xyz;
}
Я могу наблюдать _ZZ1fvE3xyz (как искажено gcc 3.2.3 или gcc 4.0.1).
Тот код просто выглядит опасным... :-)
Но так или иначе, Ваше скорректированное имя собирается зависеть от Вашего Соглашения о вызовах Поэтому, прежде чем Вы найдете, что Ваше искажение называет Вас, должен знать то, что Ваша среда сборки использует в качестве соглашения о вызовах. MSDN имеет намного больше информации о соглашении о вызовах.
Помимо этого, один способ узнать всю эту информацию о Вашем классе состоит в том, чтобы осмотреть Ваш VTable, который найден в первых 4 байтах Вашего объекта. Изящный прием, что использованием инверторов является скрытый VC ++ Флаг reportSingleClassLayout, который печатает структуру класса способом ASCII-творчества.