Как делает VC ++, искажают локальные имена статической переменной?

SqlException с ошибкой 40 означает, что вы не можете подключиться к вашему SQL Server.

Кажется, у вас неправильная конфигурация на вашем сервере или сервер не в сети.

  1. проверьте, запущена ли на вашем компьютере служба «SQL Server (INSTANCENAME)»
  2. проверьте в Configuration Manager (SQL Server), включен ли TCP / IP
  3. [ 114] проверьте в SQL Management Studio, если в свойствах Сервера включены удаленные подключения.
  4. Если SQL Server не находится на вашем локальном компьютере, убедитесь, что порты для связи открыты

Здесь вы можете найти подробное описание того, как выполнять шаги выше.

6
задан Owen 13 November 2008 в 21:15
поделиться

3 ответа

Ну, ограниченные по объему функцией помехи 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 имеет виртуальные функции, Вы смогли находить его местоположение твердым путем:

  • Сделайте полный дамп памяти из процесса.
  • Загрузите полный дамп памяти в WinDbg.
  • Используйте 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.

5
ответ дан 17 December 2019 в 00:16
поделиться

В gdb можно поместить контрольную точку на скорректированное имя переменной.

Например, с этой функцией:

int f() {
    static int xyz = 0;
    ++xyz;

    return xyz;
}

Я могу наблюдать _ZZ1fvE3xyz (как искажено gcc 3.2.3 или gcc 4.0.1).

1
ответ дан 17 December 2019 в 00:16
поделиться

Тот код просто выглядит опасным... :-)

Но так или иначе, Ваше скорректированное имя собирается зависеть от Вашего Соглашения о вызовах Поэтому, прежде чем Вы найдете, что Ваше искажение называет Вас, должен знать то, что Ваша среда сборки использует в качестве соглашения о вызовах. MSDN имеет намного больше информации о соглашении о вызовах.

Помимо этого, один способ узнать всю эту информацию о Вашем классе состоит в том, чтобы осмотреть Ваш VTable, который найден в первых 4 байтах Вашего объекта. Изящный прием, что использованием инверторов является скрытый VC ++ Флаг reportSingleClassLayout, который печатает структуру класса способом ASCII-творчества.

1
ответ дан 17 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: