簡體   English   中英

如何解決使用 C 代碼更改主 function 輸入中的分段錯誤?

[英]How to solve segmentation fault in change main function inputs with C code?

我想要將與 Sysbench 工具 ( https://github.com/akopytov/sysbench ) 相關的以下代碼從以下代碼更改為下一個代碼,但僅通過這個小更改就出現錯誤 (Segmentation故障(核心轉儲))。

./sysbench cpu --cpu-max-prime=2000 run

int main(int argc,char *argv[])
        {   
            .
            .
            .
        }

int main(void)
{  
 char *argv[]= {"./sysbench","cpu","--cpu-max-prime=2000","run", NULL};
 int argc = sizeof(argv) / sizeof(char*) - 1; 
           .
           .
           .

}

使用 GDB 調試:

Program received signal SIGSEGV, Segmentation fault.
0x000000000040aec8 in parse_option (
   name=name@entry=0x4768e8 "cpu-max-prime=2000", 
   ignore_unknown=ignore_unknown@entry=false) at sysbench.c:500
500     *tmp = '\0';
static int parse_option(char *name, bool ignore_unknown)
{
 const char        *value;
 char              *tmp;
 option_t          *opt;
 char              ctmp = 0;
 int               rc;

 tmp = strchr(name, '=');
 printf( "tmp: %s\n", tmp );
 if (tmp != NULL)
 {
   ctmp = *tmp;
   *tmp = '\0';
   value = tmp + 1;
 }
 else
 {
   value = NULL;
 }

 opt = sb_find_option(name);
 if (opt != NULL || ignore_unknown)
   rc = set_option(name, value,
                   opt != NULL ? opt->type : SB_ARG_TYPE_STRING) == NULL;
 else
   rc =  1;

 if (tmp != NULL)
   *tmp = ctmp;

 return rc;
}

請幫我。 謝謝。

為了從main中模擬argvargv[n]指向的字符串必須是可寫的,在您的代碼中情況並非如此,其中argv[n]指向無法寫入的字符串文字。

寫入字符串文字在 C 中是正式未定義的行為,但在現代桌面平台上,它通常會觸發段錯誤。

並且*tmp = '\0'; 實際上是寫入一個字符串。

這應該可以完成工作,但我不完全確定,因為我無法在此處輕松檢查。

int main(void)
{
  char arg1[] = "./sysbench";
  char arg2[] = "cpu";
  char arg3[] = "--cpu-max-prime=2000";
  char arg4[] = "run";
  char* argv[] = {arg1, arg2, arg3, arg4, NULL};
  ...
  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM