Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Extended procedure вываливается с Access violation  [new]
BootMaker
Member

Откуда: С-Петербург
Сообщений: 902
Собственно, сабж.
Как отловить параметры, при которых это случилось. В профайлере не получается. К тому же если процедура валится с таким сообщением, все последующие попытки вызова этой процедуры тоже валятся с ним. Спасает только перезагрузка сервера. В чем может быть дело?
4 авг 05, 19:10    [1765289]     Ответить | Цитировать Сообщить модератору
 Re: Extended procedure вываливается с Access violation  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
BootMaker
Собственно, сабж.
Как отловить параметры, при которых это случилось. В профайлере не получается. К тому же если процедура валится с таким сообщением, все последующие попытки вызова этой процедуры тоже валятся с ним. Спасает только перезагрузка сервера. В чем может быть дело?


Ясный перец - криво написана.
4 авг 05, 19:13    [1765296]     Ответить | Цитировать Сообщить модератору
 Re: Extended procedure вываливается с Access violation  [new]
sburm
Member

Откуда: Москва
Сообщений: 81
Если есть шестая MSVisualStudioто можно в debuge посмотреть, что происходит
4 авг 05, 19:55    [1765350]     Ответить | Цитировать Сообщить модератору
 Re: Extended procedure вываливается с Access violation  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
sburm
Если есть шестая MSVisualStudioто можно в debuge посмотреть, что происходит


даже в VS2005 это можно делать.

и не забывает try
catch ставить где нужно
5 авг 05, 01:23    [1765642]     Ответить | Цитировать Сообщить модератору
 Re: Extended procedure вываливается с Access violation  [new]
BootMaker
Member

Откуда: С-Петербург
Сообщений: 902
Ну а почему последующие вызовы не проходят? Такое ощущение, что на стороне сервера что-то раз и навсегда залочилось...
Да и посмотреть не получается - она же не каждый раз валится. Вот если бы отследить как-то.
5 авг 05, 10:08    [1766073]     Ответить | Цитировать Сообщить модератору
 Re: Extended procedure вываливается с Access violation  [new]
Александр Спелицин
Member

Откуда: Из ближайшего подмосковья.
Сообщений: 2506
Запустите MSSQL под отладчиком и фиксируйте всю отладочную информацию из Вашей dll. А при "падении" анализируйте логи.

BootMaker
Ну а почему последующие вызовы не проходят? Такое ощущение, что на стороне сервера что-то раз и навсегда залочилось...

Лучше не испытывать судьбу на рабочем сервере. Глюкануло -> тутже перезагрузить MSSQL. Иначе за целостность Ваших баз ручаться никто не будет.
5 авг 05, 10:21    [1766138]     Ответить | Цитировать Сообщить модератору
 Re: Extended procedure вываливается с Access violation  [new]
BootMaker
Member

Откуда: С-Петербург
Сообщений: 902
Простите за глупый вопрос - а под отладчиком - это как? Где об этом можно почитать?
Сколько клиентов может конектиться к серверу в таком состоянии?
5 авг 05, 10:44    [1766275]     Ответить | Цитировать Сообщить модератору
 Re: Extended procedure вываливается с Access violation  [new]
Александр Спелицин
Member

Откуда: Из ближайшего подмосковья.
Сообщений: 2506
1.
  • BOL;
  • Рихтер. Программиование серверных приложений для Windows 2000.

    2. Ровно столько же, как и в случае без отладчика.
  • 5 авг 05, 10:50    [1766309]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    BootMaker
    Member

    Откуда: С-Петербург
    Сообщений: 902
    Все же не удалось понять, как это - запустить под отладчиком. Может, кто-нибудь более точно меня отправит в BOL ,например? Или пару слов скажет.
    12 авг 05, 13:40    [1781800]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    BootMaker
    Member

    Откуда: С-Петербург
    Сообщений: 902
    Ну, парой слов буквально!
    15 авг 05, 10:27    [1785495]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    SergSuper
    Member

    Откуда: SPb
    Сообщений: 5488
    Extended procedure вещь довольно ответственная и если вы при их написании собираетесь постоянно обращаться в форум - я бы посоветовал попробовать обходиться без них.

    PS. на 95% уверен что они вам не нужны
    15 авг 05, 12:30    [1786037]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    Александр Спелицин
    Member

    Откуда: Из ближайшего подмосковья.
    Сообщений: 2506
    Если Ваши программы размещались не только в *.exe, но и в *.dll, то Вы должны знать, что для запуска dll требуется внешний exe. Так вот, для вашей dll c Extended procedure таким *.exe будет MSSQL Server (sqlservr.exe).
    Как запускать MSSQL из командной строки рассказано в BOL.
    15 авг 05, 13:26    [1786300]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    Lepsik
    Member

    Откуда: glubinka
    Сообщений: 4256
    2SergSuper

    кому-то же надо учится :)

    трассировать ESP несложно.

    --для запуска идете в окно Debug->Atach to process
    --в окне процессов находите sqlservr.exe и выбираете его.

    когда в QA выполните вашу процедуру - управление перейдет внуть вашей процедуры - точку останова F9 не забудте оставить.


    ну и естественно в пропертях ESP путь должен лежать к вашей dll в папке Debug.

    -------------------

    ну и для совсем трудно уловимых вещей я сделал внутренний лог :

    exec master..xp_RIMlog

    обязательно ставь try - catch и в случает exeption клади все все в лог







    //--------------------------------------------------------------------------------------------------------
    extern void SET_LOG( const std::wstring &x, const int line );
    // LOG functions
    vector< pair<string, wstring> > list_log;
    int counterNtfLog = 0;  // counter shows number of clearings of the log
    //---------------------------------------------------------------------------------------------------------------------
    void SET_LOG( const std::string &x, const int line )
    {
        std::wstring s; 
        sts::s2w( s, x ); 
        SET_LOG( s, line ); 
    }
    //---------------------------------------------------------------------------------------------------------------------
    void SET_LOG( const wstring &x, const int line )
    {
        SYSTEMTIME st;
        GetSystemTime(&st);              // gets current time
        char str[8192] = {0};
        try
        { 
            sprintf(str, "%02d/%02d %02d:%02d:%02d on %d", 
                st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, line);
            if( list_log.size() > 8192 )
            { 
                list_log.clear(); 
                counterNtfLog++;
            }
            else
            {
                list_log.push_back( pair<string, wstring>(str, x) ); 
            }
        }catch(...){}
    }
    wstring GetCurrentInstanceName();
    //--------------------------------------------------------------------------------------------------------
    RETCODE __declspec(dllexport) xp_log( SRV_PROC *srvproc )
    {
        int nRowsFetched = 0;
        srv_describe(srvproc, 1, (DBCHAR *)"num", SRV_NULLTERM, SRVINT4, 4, SRVINT4, 4, NULL);
        srv_describe(srvproc, 2, (DBCHAR *)"stamp", SRV_NULLTERM, SRVVARCHAR, 16, SRVVARCHAR, 16, NULL);
        srv_describe(srvproc, 3, (DBCHAR *)"log", SRV_NULLTERM, SRVNTEXT, 1024, SRVNTEXT, 1024, NULL);
        try 
        {
            // return lock information
            SYSTEMTIME st;
            GetSystemTime(&st);              // gets current time
            char dstr[220] = {0};
    
    
           wchar_t szPath[MAX_PATH]; 
           GetModuleFileNameW( NULL, szPath, MAX_PATH );
    
            wstring  name_inst = GetCurrentInstanceName();
    
            srv_setcollen (srvproc, 1, (short)4);   srv_setcoldata (srvproc, 1, &nRowsFetched);
            
            sprintf(dstr, "%02d/%02d %02d:%02d:%02d : %s", st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, (void *)GetModuleFileName );
            srv_setcollen (srvproc, 2, strlen(dstr));   srv_setcoldata (srvproc, 2, dstr);
            srv_setcollen (srvproc, 3, name_inst.length()); srv_setcoldata (srvproc, 3, (void *)name_inst.c_str());
            if( srv_sendrow (srvproc) == SUCCEED )
            {
    		        nRowsFetched++;                        // Go to the next row. 
            } 
    //        srv_sendmsg(srvproc, SRV_MSG_INFO, 777, SRV_INFO, (DBTINYINT) 0, NULL, 0, 0, str, SRV_NULLTERM);
            if( !list_log.empty() )
            {
                int sz = list_log.size() - 1;
                for(size_t i = sz; i > 0; i--)
                {
                    if( i >= 0 && !list_log[i].second.empty() )
                    {
                        char *dts = (char *)list_log[i].first.c_str();
                        wstring log  = list_log[i].second;
                        //srv_sendmsg(srvproc, SRV_MSG_INFO, 777, SRV_INFO, (DBTINYINT) 0, NULL, 0, 0, (char *)log.c_str(), SRV_NULLTERM);
                        srv_setcollen (srvproc, 1, (short)4);    srv_setcoldata (srvproc, 1, &i);
                        srv_setcollen (srvproc, 2, strlen(dts));   srv_setcoldata (srvproc, 2, dts);
                        srv_setcollen (srvproc, 3, log.length()<<1); srv_setcoldata (srvproc, 3, (void *)log.c_str() );
                        if( srv_sendrow (srvproc) == SUCCEED )
                        {
    		                    nRowsFetched++;                        // Go to the next row. 
                        } 
                    }
                }
            }
            if( nRowsFetched > 0 )
            {
                srv_senddone (srvproc, SRV_DONE_COUNT | SRV_DONE_MORE, (DBUSMALLINT) 0, nRowsFetched);
            }
            else 
            {
                srv_senddone (srvproc, SRV_DONE_MORE, (DBUSMALLINT) 0, (DBINT) 0);
            }
        }catch(...)
        {
        }
        return 0;
    }
    
    15 авг 05, 18:15    [1787651]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    GreenSunrise
    Member

    Откуда:
    Сообщений: 12310
    Про отладку надо было дочитать BOL. Там все есть. Debugging an Extended Stored Procedure

    А также
    HOW TO: Debug an Extended Stored Procedure
    Debugging Extended Stored Procedures
    15 авг 05, 18:37    [1787725]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    gaper
    Member

    Откуда:
    Сообщений: 78
    В своё время наступли на одну граблю: пытался передать srvproc в другой поток. Делать этого, по-видимому, нельзя. Других неприятностей не встречал. Про отладку можно прочитать в "SQL Server Books Online" (ищи extended stored procedures)
    15 авг 05, 18:42    [1787745]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    Lepsik
    Member

    Откуда: glubinka
    Сообщений: 4256
    --GreenSunrise

    в пути описанном во всех предложенных ссылках есть ряд недостатков, которые порой не просто преодолеть.
    15 авг 05, 19:35    [1787880]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    Lepsik
    Member

    Откуда: glubinka
    Сообщений: 4256
    gaper
    В своё время наступли на одну граблю: пытался передать srvproc в другой поток. Делать этого, по-видимому, нельзя. Других неприятностей не встречал. Про отладку можно прочитать в "SQL Server Books Online" (ищи extended stored procedures)


    я таки натолкнулся на неприятную вещь ODS не совсем потокобезопасна, пришлось каждую интерфейсную функцию закрывать мутексами.
    хотелось верить что у меня руки кривые, но пока не закрыл все без исключения вызываемые функции - мучался со случайными локами.
    15 авг 05, 19:39    [1787888]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    SergSuper
    Member

    Откуда: SPb
    Сообщений: 5488
    2 Lepsik
    Я не против того чтоб кто-то учился и если что подсказать. Но...
    1. xp_ - процедуры - это уже прошлый век, я конечно понимаю что вам хочется передать свой опыт, но согласитесь нет смысла тратить время на изучение тупиковых технологий
    2. эти процедуры должны быть тщательно отлажены и писаться опытным человеком - и всё равно риск завалить сервер остаётся
    3. я думаю вы согласитесь что xp_ - процедуры надо использовать только в самом крайнем случае (даже после курсоров и динамических запросов:). У вас есть уверенность что это такой случай?

    Может чем учить человека обходить грабли с ОДС помочь найти более умное решение?
    15 авг 05, 20:16    [1787969]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    gaper
    Member

    Откуда:
    Сообщений: 78
    2SuperSerg
    В некотором смысле SQL Server 2000 - тоже прошлый век :)
    С остальным [2 и 3] не поспоришь. Всё так. Но иногда без них никак. У меня у самого был такой случай. Неслучайно другие субд расширяют поддержку подобных решений. Хотя соглашуюсь, что реализация в данном случае самая кривая.

    А подсказать обходные пути можно было бы, если бы об этом кто-то просил.
    15 авг 05, 20:31    [1787996]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    Lepsik
    Member

    Откуда: glubinka
    Сообщений: 4256
    SergSuper
    1. xp_ - процедуры - это уже прошлый век, я конечно понимаю что вам хочется передать свой опыт, но согласитесь нет смысла тратить время на изучение тупиковых технологий


    в какой именно части ? Я вот регулярно сталкиваюсь с задачами, которые, в принципе, можно решить через сторонние сервисы, но уж больно затратно получается.

    SergSuper

    2. эти процедуры должны быть тщательно отлажены и писаться опытным человеком - и всё равно риск завалить сервер остаётся


    честно говоря завалить непросто. Дело в том что хоть ESP и выполняется в контексте процесса, но отдельным тредом и если что-то валится, то сервер в большинстве случаев тред прибивает вполне успешно. Скажем в 90% случаев.
    Конечно это не снижает роли тестирования, но ничего экстраординарного я в этом не вижу. В DB/2 чуть лучше с этим ситуация (ESP можно отдельным процессом ранить), но до последнего времени встроенных скриптов вообще не было и никто не умер.

    Новая .net технология ничего нового не принесла, те же dll, только интерефейс к другим языkам присобачили и более надежными сделали вызовы.

    SergSuper

    3. я думаю вы согласитесь что xp_ - процедуры надо использовать только в самом крайнем случае (даже после курсоров и динамических запросов:). У вас есть уверенность что это такой случай?


    Если можно обойтись - старась обойтись

    SergSuper

    Может чем учить человека обходить грабли с ОДС помочь найти более умное решение?


    Если бы он рассказал о своей проблеме вероятно мы бы постарались помочь.
    Но если человек считает что ESP необходима - пусть пытается. Ничего плохого в преодолении ошибок я не вижу.
    15 авг 05, 21:56    [1788100]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    GreenSunrise
    Member

    Откуда:
    Сообщений: 12310
    Lepsik
    --GreenSunrise

    в пути описанном во всех предложенных ссылках есть ряд недостатков, которые порой не просто преодолеть.

    Расскажите, пожалуйста. Мне приходилось писать и отлаживать xp, именно опираясь на эти ссылки и все возникающие проблемы рано или поздно побеждались. Хочется услышать, какие конкретные проблемы вам не удалось решить.
    16 авг 05, 11:08    [1789096]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    Lepsik
    Member

    Откуда: glubinka
    Сообщений: 4256
    [quot GreenSunrise Хочется услышать, какие конкретные проблемы вам не удалось решить.[/quot]

    в частности пукт 2

    --2. After you correctly build the DLL, copy it to the C:\Mssql\Binn folder. The DLL that SQL Server is loading and the .pdb file must be synchronized to properly handle breakpoints.

    В силу специфики продукта и сложности проекта dll не должна туда копироваться. Поэтому и удивляет рекомендация микрософта, при том что есть и другой стандартный, ими же предложенный путь.
    16 авг 05, 18:57    [1792090]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    GreenSunrise
    Member

    Откуда:
    Сообщений: 12310
    Lepsik
    в частности пукт 2

    --2. After you correctly build the DLL, copy it to the C:\Mssql\Binn folder. The DLL that SQL Server is loading and the .pdb file must be synchronized to properly handle breakpoints.

    В силу специфики продукта и сложности проекта dll не должна туда копироваться. Поэтому и удивляет рекомендация микрософта, при том что есть и другой стандартный, ими же предложенный путь.

    Под "другим стандартным путем" вы подразумеваете, что DLL'ка кладется не в binn каталог? Единственная проблема при этом то, что DBCC dllname (FREE) не выгружает ее из памяти.
    16 авг 05, 19:00    [1792097]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    Lepsik
    Member

    Откуда: glubinka
    Сообщений: 4256
    [quot GreenSunriseВ силу специфики продукта и сложности проекта dll не должна туда копироваться. Поэтому и удивляет рекомендация микрософта, при том что есть и другой стандартный, ими же предложенный путь.[/quot]
    Под "другим стандартным путем" вы подразумеваете, что DLL'ка кладется не в binn каталог? Единственная проблема при этом то, что DBCC dllname (FREE) не выгружает ее из памяти.[/quot]

    у меня с этим проблем нет
    16 авг 05, 19:11    [1792127]     Ответить | Цитировать Сообщить модератору
     Re: Extended procedure вываливается с Access violation  [new]
    BootMaker
    Member

    Откуда: С-Петербург
    Сообщений: 902
    Всем спасибо за помощь.
    Замечу следующие моменты:
    1. Без esp не обойтись. Они дергают специфическое железо на сервере и вообще написаны сторонним разработчиком.
    2. Они могут отработать корректно 20 раз подряд и завалиться на 21-ом. Ждать ошибки в VS было бы накладно.
    3. Когда происходит Access violation, коннект от клиента отваливается, но на самом сервере остается висеть процесс, который надо еще очень долго убивать (ждать пару минут).
    4. Даже когда убьешь процесс, остаются залоченными таблицы. Спасает только перезагрузка сервера.
    15 сен 05, 15:44    [1881296]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить