Ошибка - нет исходного кода для текущего местоположения - PullRequest
0 голосов
/ 03 марта 2011

Когда я пытаюсь отладить программу на C, написанную на компьютере с Linux (сейчас я использую Visual C ++ Express), я сначала получаю ошибку переполнение стека .Поэтому, когда я нажал «продолжить», я получил другое сообщение об ошибке:

Место чтения нарушения доступа 0x00030000

Поэтому я решил отладить шаг за шагом.Поэтому, когда я пытаюсь это сделать, он показывает мне ошибку

Нет исходного кода, доступного для текущего местоположения.

В чем причина этой ошибки?

Код

    #if 1
    while(1)
    #endif
    {
        fillList();
        #if 1
        {
            op_ds_bulk(ops, &total, 1);
            temp = res("Bulk Write:", total, fp);
            index = 0;
        }
        #endif

        void op_ds_bulk(u_int ops, u_int * totalp, int update)
        {
            char encode_db[] = "encode";
            if(update)
            {
                database_insert_bluk(list, ops);
                database_sync();
                *totalp = ops;
            }
            else
            {
                CHUNK prefetch[4096];
                int random = rand() % (h-ops+1);
                __os_clock(NULL, &start_time.secs, &start_time.usecs);
                database_select_end(65546, random, prefetch, ops);
                __os_clock(NULL, &end_time.secs, &end_time.usecs);
               *totalp = ops;
            }
        }
    }

Ответы [ 3 ]

1 голос
/ 03 марта 2011

Недопустимый доступ может произойти где-нибудь в коде стандартной библиотеки.Источник для этого не доступен в Express Edition.

Вы можете проверить стек вызовов на ту часть кода, которая вызывает библиотечную функцию, и обработать ее оттуда.

0 голосов
/ 03 марта 2011

Я решил проблему, написав один и тот же код с другим именем функции.Это так странно для меня, потому что это решило мою проблему.Я не знаю почему.

0 голосов
/ 03 марта 2011

Некоторое время назад у меня была похожая проблема, может, она связана с вашей?

У меня был массив в стеке (у вас он тоже есть - prefetch), и я случайно очистил его слишком далеко (за пределами массива), удалив любую информацию, находящуюся за пределами массива.

Когда вы вызываете функцию, адрес возврата также сохраняется в стеке (компьютер должен знать, куда возвращаться из функции). Так как я очистил это, программа перешла под адрес 0x0 и SegFault-ed. При отладке я также получил сообщение «нет исходного кода в текущем местоположении», потому что «текущее местоположение» было 0x0 и, конечно, там не было кода.

Так что я подозреваю, что вы выходите за пределы некоторого массива, который находится в стеке.

Просматривая ваш код, я вижу две подозрительные вещи:

  • Размер вашего массива предварительной выборки равен 4096, но вы вызываете database_select_end с параметром 65546. Возможно, это нормально (не знаю, что делает эта функция), но, возможно, это не так;)

  • 65546 не является степенью 2. 2 ^ 16 = 65536

...