Этот вопрос заинтриговал меня, поэтому я провел небольшое исследование. То, что вы ищете, это « dll инъекция ». Вы пишете функцию для замены некоторой библиотечной функции, помещаете ее в .so и говорите ld предварительно загрузить вашу dll. Я только что попробовал, и это работало отлично! Я понимаю, что на самом деле это не отвечает на ваш вопрос относительно gdb, но я думаю, что он предлагает эффективный обходной путь.
Для решения только для GDB, см. Мое другое решение.
// -*- compile-command: "gcc -Wall -ggdb -o test test.c"; -*-
// test.c
#include "stdio.h"
#include "stdlib.h"
int main(int argc, char** argv)
{
//should print a fairly random number...
printf("Super random number: %d\n", rand());
return 0;
}
/ -*- compile-command: "gcc -Wall -fPIC -shared my_rand.c -o my_rand.so"; -*-
//my_rand.c
int rand(void)
{
return 42;
}
скомпилируйте оба файла, затем выполните: LD_PRELOAD="./my_rand.so" ./test
Super random number: 42
Я бы отредактировал ответ Дэниела Роземанса и проголосовал бы за него, но, поскольку я не могу его отредактировать, я опубликую здесь правильный ответ:
class IncomingForm(ModelForm):
class Meta:
model = Incoming
def __init__(self, *args, **kwargs):
super(IncomingForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['cat_id'].queryset = Category.objects.filter(
parents__exact=self.instance.id)
Разница в self.fields ['cat_id '] (правильно) vs self.fields [' parent '] (неверно, мы оба сделали одну и ту же ошибку)
Как вы говорите, вам нужен класс modelform с пользовательским __ init __
:
class IncomingForm(ModelForm):
class Meta:
model = Incoming
def __init__(self, *args, **kwargs):
super(IncomingForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['parents'].queryset = Category.objects.filter(
parents__exact=instance.id)