Commit b7729b83 by 钱炳权

异常定位开发完成

parent 99d14daf
...@@ -4,6 +4,7 @@ import com.example.fuzzControll.domain.bo.AflnetDataParams; ...@@ -4,6 +4,7 @@ import com.example.fuzzControll.domain.bo.AflnetDataParams;
import com.example.fuzzControll.domain.vo.AjaxResult; import com.example.fuzzControll.domain.vo.AjaxResult;
import com.example.fuzzControll.service.AflnetPersistenceService; import com.example.fuzzControll.service.AflnetPersistenceService;
import com.example.fuzzControll.service.TestService; import com.example.fuzzControll.service.TestService;
import com.example.fuzzControll.tools.system.SystemRunningParams;
import com.example.fuzzControll.tools.test.TestCmdTools; import com.example.fuzzControll.tools.test.TestCmdTools;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -35,25 +36,39 @@ public class AflnetDataController { ...@@ -35,25 +36,39 @@ public class AflnetDataController {
} }
return AjaxResult.success("File loaded successfully!"); return AjaxResult.success("File loaded successfully!");
} }
/** /**
* 异常重放(查看堆栈) * 异常重放
*/ */
@RequestMapping(value = "/replay", method = RequestMethod.GET) @RequestMapping(value = "/replay", method = RequestMethod.GET)
public AjaxResult replay(@RequestParam String programPath) { public AjaxResult replay(@RequestParam String targetServer,@RequestParam String targetServerCodePath,
@RequestParam String targetServerPort,@RequestParam String protocol,
@RequestParam String pathToCrash) {
try {
testService.replay(targetServer,targetServerCodePath,targetServerPort,protocol,pathToCrash);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("Replay failed!");
}
return AjaxResult.success("Replay successfully!");
}
/**
* 异常分析
*/
@RequestMapping(value = "/analyse", method = RequestMethod.GET)
public AjaxResult analyse(@RequestParam String codePath, @RequestParam String programName) {
try { try {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
testService.replay(programPath); testService.analyse(codePath, programName);
} }
}).start(); }).start();
Thread.sleep(1000); Thread.sleep(1000);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return AjaxResult.error("Replay failed!"); return AjaxResult.error("Analyse failed!");
} }
return AjaxResult.success("Start replay success!"); return AjaxResult.success("Analyse success!");
} }
/** /**
......
...@@ -14,7 +14,9 @@ public interface TestService { ...@@ -14,7 +14,9 @@ public interface TestService {
LinkedHashMap<String,String> getProcessInfo(); LinkedHashMap<String,String> getProcessInfo();
void replay(String programPath); void analyse(String codePath,String programPath);
List<String> getReplayResult(); List<String> getReplayResult();
void replay(String targetServer, String targetServerCodePath, String targetServerPort, String protocol, String pathToCrash);
} }
...@@ -20,6 +20,7 @@ import com.example.fuzzControll.tools.system.SystemRunningParams; ...@@ -20,6 +20,7 @@ import com.example.fuzzControll.tools.system.SystemRunningParams;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
...@@ -28,6 +29,7 @@ import java.util.Date; ...@@ -28,6 +29,7 @@ import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@Service("testService") @Service("testService")
@Slf4j @Slf4j
...@@ -92,9 +94,8 @@ public class TestServiceImpl implements TestService { ...@@ -92,9 +94,8 @@ public class TestServiceImpl implements TestService {
} }
@Override @Override
public void replay(String programPath) { public void analyse(String codePath, String programPath) {
String cmd = "gdb /usr/fuzzenv/fuzzenv/live555/testProgs/" + programPath + " /usr/fuzzenv/fuzzenv/live555/testProgs/core" + String cmd = "gdb " + codePath + programPath + " " + codePath + "core";
" > /usr/dump.txt";
log.info("Replay cmd is {}", cmd); log.info("Replay cmd is {}", cmd);
SystemRunningParams.ReplayResults = new ArrayList<>(); SystemRunningParams.ReplayResults = new ArrayList<>();
try { try {
...@@ -108,6 +109,7 @@ public class TestServiceImpl implements TestService { ...@@ -108,6 +109,7 @@ public class TestServiceImpl implements TestService {
@Override @Override
public List<String> getReplayResult() { public List<String> getReplayResult() {
/*停止GDB*/ /*停止GDB*/
SystemRunningParams.ReplayResults = new ArrayList<>();
try { try {
cmdTools.runCmd("pkill gdb", "getReplayResult-stopGdb"); cmdTools.runCmd("pkill gdb", "getReplayResult-stopGdb");
} catch (CmdException e) { } catch (CmdException e) {
...@@ -131,4 +133,47 @@ public class TestServiceImpl implements TestService { ...@@ -131,4 +133,47 @@ public class TestServiceImpl implements TestService {
// } // }
return SystemRunningParams.ReplayResults; return SystemRunningParams.ReplayResults;
} }
@Override
public void replay(String targetServer, String targetServerCodePath, String targetServerPort, String protocol, String pathToCrash) {
/*删除当前目录生成的dump文件*/
try {
List<String> temp = new ArrayList<String>();
int m = 0;
while (m <= 1) {
temp = cmdTools.runCmdReturnError(CmdConstent.DELETE_FILE + targetServerCodePath + "core", "replay-removeFile");
m++;
}
if (temp.stream().noneMatch(s -> s.contains("No such file or directory"))) {
throw new RuntimeException("Remove failed!");
}
} catch (RuntimeException e) {
log.error("File remove failed:{}", e.getMessage());
throw new RuntimeException(e);
}
/*启动目标服务器,存在阻塞所以新开另外起线程*/
SystemRunningParams.ReplayRunServerMessage = new ArrayList<>();
int i = 0;
while (i <= 1) {//两次保证服务器可以启动
new Thread(new Runnable() {
@Override
public void run() {
String runServerCmd = targetServerCodePath + targetServer + " " + targetServerPort;
log.info("Server start cmd is:[{}]", runServerCmd);
TestCmdTools cmdTools = new TestCmdTools();
cmdTools.runClogCmd(runServerCmd, SystemRunningParams.ReplayRunServerMessage, "replay-startServer");
}
}).start();
i++;
}
/*异常重放,会自动引起服务器关闭*/
try {//保证服务器成功启动
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
String crashCmd = "aflnet-replay" + " " + pathToCrash + " " + protocol + " " + targetServerPort;
log.info("Replay crash cmd is:[{}]", crashCmd);
cmdTools.runCmd(crashCmd, "replay-crash");
}
} }
...@@ -41,9 +41,13 @@ public class SystemRunningParams { ...@@ -41,9 +41,13 @@ public class SystemRunningParams {
public static LinkedHashMap<String, String> TestProgressMap = new LinkedHashMap<>(); public static LinkedHashMap<String, String> TestProgressMap = new LinkedHashMap<>();
/** /**
* 异常重放数据 * 异常重放结果数据
*/ */
public static List<String> ReplayResults = new ArrayList<>(); public static List<String> ReplayResults = new ArrayList<>();
/**
* 异常重放启动服务器信息数据
*/
public static List<String> ReplayRunServerMessage = new ArrayList<>();
public static void init() { public static void init() {
/*初始化aflnet和kitty时间参数*/ /*初始化aflnet和kitty时间参数*/
testTimeMessage.put("aflnet", new ConcurrentHashMap<>()); testTimeMessage.put("aflnet", new ConcurrentHashMap<>());
......
...@@ -29,6 +29,64 @@ public class TestCmdTools { ...@@ -29,6 +29,64 @@ public class TestCmdTools {
Boolean send = false; Boolean send = false;
Boolean show = true; Boolean show = true;
/**
* 运行指令返回错误信息
*/
public List<String> runCmdReturnError(String cmd, String caller) throws CmdException {
List<String> result = new ArrayList<String>();
List<String> error = new ArrayList<String>();
try {
log.info(caller + " is running!");
log.info("Running cmd:[{}]", cmd);
Process process = Runtime.getRuntime().exec(cmd);
printMessage(process.getInputStream(), result);
printMessage(process.getErrorStream(), error);
process.waitFor();
log.info(caller + " end!");
} catch (Exception e) {
e.printStackTrace();
throw new CmdException(caller + " run cmd failed!");
}
return error;
}
/**
* 运行会阻塞的命令行
*/
public List<String> runClogCmd(String cmd, List<String> response, String caller) throws CmdException {
try {
log.info(caller + " is running!");
log.info("Running cmd:[{}]", cmd);
Process process = Runtime.getRuntime().exec(cmd);
printMessageClogCmd(process.getInputStream(), response);
printMessageClogCmd(process.getErrorStream(), new ArrayList<>());
process.waitFor();
log.info(caller + " end!");
} catch (Exception e) {
e.printStackTrace();
throw new CmdException(caller + " run cmd failed!");
}
return response;
}
private void printMessageClogCmd(InputStream inputStream, List<String> response) {
new Thread(new Runnable() {
@Override
public void run() {
Reader reader = new InputStreamReader(inputStream);
BufferedReader bf = new BufferedReader(reader);
String line = null;
try {
while ((line = bf.readLine()) != null) {
log.info(line);
response.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
/** /**
* 运行不需要后台运行cmd * 运行不需要后台运行cmd
...@@ -48,7 +106,6 @@ public class TestCmdTools { ...@@ -48,7 +106,6 @@ public class TestCmdTools {
e.printStackTrace(); e.printStackTrace();
throw new CmdException(caller + " run cmd failed!"); throw new CmdException(caller + " run cmd failed!");
} }
return result; return result;
} }
//todo 不同协议种子路径也不同 //todo 不同协议种子路径也不同
...@@ -76,7 +133,8 @@ public class TestCmdTools { ...@@ -76,7 +133,8 @@ public class TestCmdTools {
* 运行需要后台运行cmd * 运行需要后台运行cmd
* 将数据存入文件中 * 将数据存入文件中
*/ */
public Map<String, List<String>> runProgramCmdAndResult(String cmd, String caller, String missionName) throws CmdException { public Map<String, List<String>> runProgramCmdAndResult(String cmd, String caller, String missionName) throws
CmdException {
Map<String, List<String>> result = new HashMap(); Map<String, List<String>> result = new HashMap();
List<String> out = Collections.synchronizedList(new ArrayList<String>()); List<String> out = Collections.synchronizedList(new ArrayList<String>());
List<String> error = Collections.synchronizedList(new ArrayList<String>()); List<String> error = Collections.synchronizedList(new ArrayList<String>());
......
...@@ -48,11 +48,21 @@ public class TestController { ...@@ -48,11 +48,21 @@ public class TestController {
} }
/** /**
* 异常重放分析 * 异常重放
*/ */
@RequestMapping(value = "/replay", method = RequestMethod.GET) @RequestMapping(value = "/replay", method = RequestMethod.GET)
public AjaxResult replay(@RequestParam String programPath) { public AjaxResult replay(@RequestParam String targetServer, @RequestParam String targetServerCodePath,
return fuzzIntegrationFileApi.replay(programPath); @RequestParam String targetServerPort, @RequestParam String protocol,
@RequestParam String pathToCrash) {
return fuzzIntegrationFileApi.replay(targetServer, targetServerCodePath,targetServerPort,protocol,pathToCrash);
}
/**
* 异常重放分析
*/
@RequestMapping(value = "/analyse", method = RequestMethod.GET)
public AjaxResult analyse(@RequestParam String codePath, @RequestParam String programName) {
return fuzzIntegrationFileApi.analyse(codePath, programName);
} }
/** /**
...@@ -60,6 +70,6 @@ public class TestController { ...@@ -60,6 +70,6 @@ public class TestController {
*/ */
@RequestMapping(value = "/getreplayresult", method = RequestMethod.GET) @RequestMapping(value = "/getreplayresult", method = RequestMethod.GET)
public AjaxResult getReplayResult() { public AjaxResult getReplayResult() {
return fuzzIntegrationFileApi.getReplayResult( ); return fuzzIntegrationFileApi.getReplayResult();
} }
} }
\ No newline at end of file
...@@ -136,12 +136,19 @@ public interface FuzzIntegrationFileApi { ...@@ -136,12 +136,19 @@ public interface FuzzIntegrationFileApi {
/** /**
* 异常重放分析 * 异常重放分析
*/ */
@RequestMapping(value = "/aflnet/replay", method = RequestMethod.GET) @RequestMapping(value = "/aflnet/analyse", method = RequestMethod.GET)
AjaxResult replay(@RequestParam String programPath); AjaxResult analyse(@RequestParam String codePath,@RequestParam String programName);
/** /**
* 获取异常分析结果 * 获取异常分析结果
*/ */
@RequestMapping(value = "/aflnet/getreplayresult", method = RequestMethod.GET) @RequestMapping(value = "/aflnet/getreplayresult", method = RequestMethod.GET)
AjaxResult getReplayResult(); AjaxResult getReplayResult();
/**
* 异常重放
*/
@RequestMapping(value = "/aflnet/replay", method = RequestMethod.GET)
AjaxResult replay(@RequestParam String targetServer, @RequestParam String targetServerCodePath,
@RequestParam String targetServerPort, @RequestParam String protocol,
@RequestParam String pathToCrash);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment