blob: bdffbc158b4511b68c267bb33d7b5c69b09bd55f [file] [log] [blame]
Juan Cespedes1c2be911997-06-09 01:12:01 +02001#include <stdio.h>
2#include <errno.h>
3#include <unistd.h>
Juan Cespedes1c2be911997-06-09 01:12:01 +02004#include <sys/wait.h>
Juan Cespedes155a4081997-06-11 01:19:35 +02005#include <signal.h>
Juan Cespedes1c2be911997-06-09 01:12:01 +02006
Juan Cespedes96935a91997-08-09 23:45:39 +02007#include "elf.h"
Juan Cespedesc9a48b91997-08-17 02:45:40 +02008#include "symbols.h"
Juan Cespedes07461b61997-08-22 15:29:10 +02009#include "functions.h"
Juan Cespedesef04ba41997-08-22 21:55:45 +020010#include "process.h"
Juan Cespedes96935a91997-08-09 23:45:39 +020011
Juan Cespedes96935a91997-08-09 23:45:39 +020012extern void read_config_file(const char *);
Juan Cespedes24c82531997-06-25 00:02:58 +020013
Juan Cespedes96935a91997-08-09 23:45:39 +020014int debug = 0;
Juan Cespedes5b2f9811997-07-17 00:05:10 +020015FILE * output = stderr;
16
17unsigned long return_addr;
18unsigned char return_value;
19struct library_symbol * current_symbol;
20
Juan Cespedes5b2f9811997-07-17 00:05:10 +020021static void usage(void)
22{
23 fprintf(stderr," Usage: ltrace [-d][-o output] <program> [<arguments>...]\n");
24}
25
Juan Cespedes1c2be911997-06-09 01:12:01 +020026int main(int argc, char **argv)
27{
Juan Cespedesef04ba41997-08-22 21:55:45 +020028 int pid;
Juan Cespedesad783621997-06-10 17:11:33 +020029
Juan Cespedes5b2f9811997-07-17 00:05:10 +020030 while ((argc>2) && (argv[1][0] == '-') && (argv[1][2] == '\0')) {
Juan Cespedesad783621997-06-10 17:11:33 +020031 switch(argv[1][1]) {
32 case 'd': debug++;
33 break;
Juan Cespedes5b2f9811997-07-17 00:05:10 +020034 case 'o': output = fopen(argv[2], "w");
35 if (!output) {
36 fprintf(stderr, "Can't open %s for output: %s\n", argv[2], sys_errlist[errno]);
37 exit(1);
38 }
39 argc--; argv++;
40 break;
Juan Cespedesad783621997-06-10 17:11:33 +020041 default: fprintf(stderr, "Unknown option '%c'\n", argv[1][1]);
Juan Cespedes5b2f9811997-07-17 00:05:10 +020042 usage();
Juan Cespedesad783621997-06-10 17:11:33 +020043 exit(1);
44 }
45 argc--; argv++;
46 }
Juan Cespedes1c2be911997-06-09 01:12:01 +020047
48 if (argc<2) {
Juan Cespedes5b2f9811997-07-17 00:05:10 +020049 usage();
Juan Cespedes1c2be911997-06-09 01:12:01 +020050 exit(1);
51 }
Juan Cespedesad783621997-06-10 17:11:33 +020052 if (!read_elf(argv[1])) {
Juan Cespedes5b2f9811997-07-17 00:05:10 +020053 fprintf(stderr, "%s: Not dynamically linked\n", argv[1]);
Juan Cespedes1c2be911997-06-09 01:12:01 +020054 exit(1);
55 }
Juan Cespedesef04ba41997-08-22 21:55:45 +020056
57 init_sighandler();
58
Juan Cespedes96935a91997-08-09 23:45:39 +020059 pid = attach_process(argv[1], argv+1);
Juan Cespedes5b2f9811997-07-17 00:05:10 +020060 fprintf(output, "pid %u attached\n", pid);
Juan Cespedesad783621997-06-10 17:11:33 +020061
Juan Cespedesc9a48b91997-08-17 02:45:40 +020062#if 1
Juan Cespedesad783621997-06-10 17:11:33 +020063 /* Enable breakpoints: */
Juan Cespedes5b2f9811997-07-17 00:05:10 +020064 fprintf(output, "Enabling breakpoints...\n");
Juan Cespedesc9a48b91997-08-17 02:45:40 +020065 enable_all_breakpoints(pid);
Juan Cespedes6ddb1da1997-08-11 22:32:14 +020066#endif
Juan Cespedes96935a91997-08-09 23:45:39 +020067 fprintf(output, "Reading config file(s)...\n");
68 read_config_file("/etc/ltrace.cfg");
69 read_config_file(".ltracerc");
Juan Cespedesc9a48b91997-08-17 02:45:40 +020070 continue_process(pid, 0);
Juan Cespedesad783621997-06-10 17:11:33 +020071
Juan Cespedes1c2be911997-06-09 01:12:01 +020072 while(1) {
Juan Cespedesef04ba41997-08-22 21:55:45 +020073 pause();
74 if (!list_of_processes) {
75 break;
Juan Cespedes1c2be911997-06-09 01:12:01 +020076 }
77 }
Juan Cespedesef04ba41997-08-22 21:55:45 +020078
Juan Cespedes1c2be911997-06-09 01:12:01 +020079 exit(0);
80}