如何从保存的格式字符串&中形成一个字符串parms并在gdb中打印

时间:2016-04-30 21:53:22

标签: c linux debugging scripting gdb

如何在gdb中形成字符串并打印它。我的格式字符串保存在一个单独的数组中,params保存在一个单独的结构数组中。

char * formateStr[]
struct msgs[]
{
    int formateId;
    int param1;
    int param2;
    int param3;
    int param4;
} 

在c中,我可以使用printf

打印msg而没有任何问题
printf(formateStr[msg[1].formateStrId],msg[1].param1,msg[2].param2,...);

当我尝试在gdb中执行相同操作时,我收到以下错误

(gdb) printf formateStr[msg[1].formateStrId],msg[1].param1,msg[2].param2,...
Bad format string, missing '"'.

后来我开始在c

中寻找与snprint相当的东西
snprintf(msg , formateStr[msg[1].formateStrId],msg[1].param1,msg[2].param2,...);
printf("%s", msg);

但无法找到任何答案。我怎样才能在gdb中实现这个目标?

2 个答案:

答案 0 :(得分:0)

  

在c中,我可以通过使用printf来打印msg而没有任何问题   当我尝试在gdb中执行相同操作时出现以下错误

没有在GDB中做同样的事情。在GDB中执行相同操作将如下所示:

(gdb) call printf(formateStr[msg[1].formateStrId],msg[1].param1,msg[2].param2,...)

您正在做的是调用GDB的内置printf命令。该命令expects字符串文字作为格式,因此您无法将其传递给变量,并在尝试时出错。

P.S。 format通常拼写为e

答案 1 :(得分:0)

如果您能够在实时流程中调用函数,@ EmployedRussian的答案是最好的方法。

如果没有,在大多数情况下,您可以使用gdb' eval命令构造并运行printf命令,并将其所需的字符串文字作为其第一个参数:

(gdb) list
1   char *formateStr[1] = { "address is %d.%d.%d.%d\n" };
2   struct {
3     int formateStrId;
4     int param1;
5     int param2;
6     int param3;
7     int param4;
8   } msg[1] = { 0, 192, 168, 0, 1 };
9   
10   int main(void)
(gdb) set $fmt=formateStr[msg[0].formateStrId]
(gdb) print $fmt
$2 = 0x80484b0 "address is %d.%d.%d.%d\n"
(gdb) eval "printf \"%s\", msg[0].param1, msg[0].param2, msg[0].param3, msg[0].param4", $fmt
address is 192.168.0.1

如果格式字符串包含双引号,则在使用该eval命令之前,您需要更改它以添加反斜杠,将每\"更改为\\\"