GDB может сделать это. Вам просто нужна переменная (p
в следующем фрагменте), которую вы можете проверить. Чтобы успешно получить p
, вам потребуется больше goo, а именно проверка того, что первый аргумент arg2 является char * в пределах разумного, что делается здесь, проверяя, например, что format
содержит %s
(хотя% s недостаточно , как кто-то может использовать%. * s или что-то).
static int my_fprintf(const char *format, ...)
{
const char *p;
va_list arg_list, arg2;
bool have_string = false;
va_start(arg_list, format);
va_copy(arg2, arg_list);
for (p = strchr(format, '%'); p != NULL; p = strchr(p+1, '%')) {
if (p[1] == '%')
continue;
if (p[1] != 's')
break;
have_string = true;
break;
}
if (have_string)
p = va_arg(arg2, const char *);
result = vfprintf(stream, indent_str, arg_list);
va_end(arg_list);
return result;
}
(gdb) b 1234 if have_string && strstr(p, "hello")==0
Заменить 1234 на номер строки p=va_arg...
.
Отредактировано: снимите тень с p и поместите have_string в условие разрыва.