Как я могу определить обратный адрес на стеке?

Физический размер базы данных не имеет значения. Количество записей не имеет значения.

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

я имел, мои получают до 10 ГБ только с умеренным количеством соединений, и оно обработало запросы очень хорошо.

я сфокусировался бы сначала на Ваших индексах, затем сделать, чтобы администратор сервера посмотрел на Вашу ОС, и если все, что не помогает ей, могло бы быть пора реализовать основную/ведомую конфигурацию.

18
задан Cole Johnson 2 January 2016 в 05:56
поделиться

5 ответов

Для этого есть встроенный gcc: void * __builtin_return_address (unsigned int level)

См. http://gcc.gnu.org/onlinedocs/gcc/ Return-Address.html

На некоторых архитектурах вы можете найти его в стеке относительно первого параметра. Например, на ia32 параметры помещаются (в обратном порядке), а затем выполняется вызов, который отправляет адрес возврата. Помните, что стек почти всегда (и на ia32) растет вниз . Хотя технически вам нужны ABI или соглашения о вызовах (иногда называемые соглашениями о связях ) для вашего языка и аппаратной платформы, на практике вы обычно можете догадаться, если знаете, как машина вызова процедуры op работает.

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

$ expand < ra.c
#include <stdio.h>

int main(int ac, char **av) {
  printf("%p\n", __builtin_return_address(0));
  return 0;
}
$ cc -Wall ra.c; ./a.out
0xb7e09775
$ 
26
ответ дан 30 November 2019 в 07:44
поделиться

Когда вы объявляете локальные переменные, они также находятся в стеке - например, x.

Если вы затем объявляете int * xptr и инициализируете его значением & x , он будет указывать на x.

Ничто (сильно) не мешает вам уменьшить этот указатель, чтобы заглянуть немного раньше, или увеличить его, чтобы посмотреть позже. Где-то поблизости есть ваш обратный адрес.

3
ответ дан 30 November 2019 в 07:44
поделиться

Чтобы узнать, где находится адрес возврата, вам необходимо знать, что такое соглашение о вызовах . Обычно это устанавливается компилятором и зависит от платформы, но вы можете принудительно установить его специфичными для платформы способами, например, используя __ declspec (stdcall) в Windows. Оптимизирующий компилятор может также изобрести собственное соглашение о вызовах для функций, не имеющих внешней области видимости.

Запрет на использование встроенных программ компилятора для получения адреса возврата, вам придется прибегнуть к встроенному ассемблеру для получения значения. Другие методы, которые кажутся работающими при отладке, могут быть очень уязвимы для оптимизации компилятора, которая их испортит.

2
ответ дан 30 November 2019 в 07:44
поделиться

Вы можете исследовать стек следующим образом

// assuming a 32 bit machine here
void digInStack(void) {

    int i;
    long sneak[1];

    // feel free to adjust the search limits
    for( i = -32; i <= 32; ++i) {
        printf("offset %3d: data 0x%08X\n", i, sneak[i]);
    }
 }

Вы это может сойти с рук, потому что C известен тем, что не очень конкретен в том, как вы индексируете массив. Здесь вы объявляете фиктивный массив в стеке, а затем просматриваете +/- относительно него.

Как заметил Роб Уокер, вам определенно нужно знать соглашение о вызовах вашего компилятора, чтобы понимать данные, на которые вы смотрите. Вы можете распечатать адрес нескольких функций и искать значения, которые находятся в аналогичном диапазоне, и интуитивно понять, где находится адрес возврата,

2
ответ дан 30 November 2019 в 07:44
поделиться

Также обратите внимание, что в целом язык C не гарантирует, что ваш обратный адрес находится в стеке или вообще где-либо в ОЗУ.

Там - это архитектуры процессоров, которые хранят адрес возврата в регистре, обращаясь к ОЗУ только тогда, когда вызовы начинают вкладываться. Существуют и другие архитектуры, где есть отдельный стек для адресов возврата, который не читается ЦП. Для обоих из них все еще могут быть реализованы компиляторы C.

Вот почему вам нужно быть более ясным с вашей средой.

1
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

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