[英]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
中模擬argv
, argv[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.